Ошибка: не удается связаться с функцией. Запрос отклонен - PullRequest
0 голосов
/ 24 апреля 2019

Я пытаюсь связать свою базу данных Firebase с функциями чередования через полосу, когда пользователь регистрируется на моей платформе, он автоматически создает продавца в полосе.Все работало нормально до прошлого месяца, затем из ниоткуда я сталкиваюсь с этой ошибкой.

Уже связались с поддержкой Firebase, они не могут найти причину ошибки, говоря, что они работают, чтобы найти решение, предлагаяследя за темой: https://issuetracker.google.com/u/1/issues/125425924

Некоторые люди говорят, что это может быть связано с неправильным использованием обещаний, кстати, я на Узле 6

Функция разделяется на триггер нафункции базы данных и запросов http

здесь мой index.js

exports.setPagamentiProprietario = functions.https.onRequest((req, res) => {

    let IDProprietario = req.url.replace('/',''); 
    if(IDProprietario === null){
        return res.status(400).send(impacchettaInformazioni(err,"invalid user id","400"));
    }

    return admin.auth().getUser(IDProprietario).then(function(userRecord) {
        const email = userRecord.email;
        return funcPagamenti.registraProprietario(IDProprietario,email,admin.database()).then(function(data){
            return res.status(200).send(impacchettaInformazioni(data,"ok","200"));

        }).catch(err => {
            console.log("errore registrazione stripe" + err);
            return res.status(500).send(impacchettaInformazioni(err,"error","500"));
        })

    }).catch(err => {
        console.log("errore registrazione stripe" + err);
        return res.status(500).send(impacchettaInformazioni(err,"error","500"));
    })  
})


exports.proprietarioCreato = functions.database.ref("Proprietari/{IDPropietario}").onCreate(event =>{

    const IDProprietario = event.params.IDUProprietario;
    const proprietario = event.data;

    return admin.auth().getUser(IDProprietario).then(function(userRecord) {
        const email = userRecord.email;
        return funcPagamenti.registraProprietario(IDProprietario,proprietario,email,admin.database());

    }).catch(function(error) {
        console.log("Erorre registrazione proprietario  STRIPE:", error);
    });

})

Вот мой funcPagamenti.registraPprietario:

// Registra un proprietario su stripe

exports.registraProprietario = function(IDProprietario,proprietario,email,database) {

    return new Promise((res, rej) => {

        try{

            stripe.accounts.create({
                type: 'custom',
                country: 'IT',
                first_name: proprietario.Nome,
                last_name: proprietario.Cognome,
                email: email

            }, function(err, customer) {

                if(err !== null){
                    console.log(err);
                    return rej(err);
                }
                return database.ref('Proprietari').child(IDProprietario).update({"IDPagamenti":customer.id}).then(function(){
                    return res(custumer.id);
                }).catch(err => {
                    console.log(err);
                    console.log("Errore update proprietario" + err);
                    return rej(err);
                })

            });

        }catch(errore){
            console.log(err);
            return rej(errore);
        }

    })

}

Я ожидаю, что чередование вернет идентификатор поставщика, зарегистрированного на платформе.

Вместо этого я получаю:

Ошибка: невозможно связаться с функцией.Запрос отклонен.

/// EDIT

На самом деле это была моя ошибка, я все время вызывал метод с неверной подписью, так как компилятор не давалмне любые предупреждения я не смог обнаружить его раньше, в любом случае вот ревизия:

//Registra un proprietario per accettare i pagamenti
exports.setPagamentiProprietario = functions.https.onRequest((req, res) => {

    let IDProprietario = req.url.replace('/',''); 
    if(IDProprietario === null){
        return res.status(400).send(impacchettaInformazioni(err,"invalid user id","400"));
    }

    return admin.auth().getUser(IDProprietario).then(function(userRecord) {

        return admin.database().ref("Proprietari").child(IDProprietario).once("value").then(snap => {
            const email = userRecord.email;

            return funcPagamenti.registraProprietario(req.connection.remoteAddress,IDProprietario,snap.val(),email,admin.database()).then(function(data){
                return res.status(200).send(impacchettaInformazioni(data,"ok","200"));

            }).catch(err => {
                console.log("errore query proprietario" + err);
                return res.status(500).send(impacchettaInformazioni(err,"error","500"));
            })

        }).catch(err => {
            console.log("errore registrazione stripe" + err);
            return res.status(500).send(impacchettaInformazioni(err,"err","500"));
        })  

    }).catch(err => {
        console.log("errore registrazione stripe" + err);
        return res.status(500).send(impacchettaInformazioni(err,"error","500"));
    })  
})

1 Ответ

0 голосов
/ 24 апреля 2019

Вы, вероятно, должны использовать Promise вместо функции обратного вызова при вызове Stripe node.js API.

Как сказано в документации :

Каждый метод возвращает цепное обещание, которое можно использовать вместо обычного обратного вызова

Таким образом, вы можете изменить funcPagamenti.registraProprietario следующим образом:

exports.registraProprietario = function(
  IDProprietario,
  proprietario,
  email,
  database
) {
  let accountId;

  return stripe.accounts
    .create({
      type: 'custom',
      country: 'IT',
      first_name: proprietario.Nome,
      last_name: proprietario.Cognome,
      email: email
    })
    .then(account => {
      accountId = account.id;
      return database
        .ref('Proprietari')
        .child(IDProprietario)
        .update({ IDPagamenti: accountId });
    })
    .then(() => {
      return accountId;
    });
};
...