Облачная функция Firebase никогда не завершается при вызове API 404 - PullRequest
0 голосов
/ 24 октября 2018

У меня есть функция, запускаемая при создании документа.

Когда я отправляю эту информацию во внешний API, Firebase возвращает сообщение «ОК» до завершения вызова API.

const functions = require('firebase-functions');
const request = require('request');
const admin = require('firebase-admin');
const rp = require('request-promise');

const port = '****';
const ip = '***.***.***.***';

admin.initializeApp(functions.config().firebase);

exports.sendUser = functions.firestore
  .document('user/{userId}')
  .onCreate((snap, context) => {

    const data = snap.data();
    const options = {
      method: 'POST',
      uri: 'http://' + ip + ':' + port + '/user',
      body: data,
      json: true,
    };

    rp(options)
      .then(function (parsedBody) {
        console.log('TEN ', parsedBody);
        return parsedBody;
      })
      .catch(function (err) {
        console.log('ERR ', err);
        return err;
      });
  });

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

API выглядит следующим образом: -

app.post('/user', function (req, res) {

    fs.exists(path, function(exists) {
        if (exists === true) {
            console.log('Currently Printing Different User Info');
            fs.unlinkSync(path);        
            res.status(404).json({errorCode: 404, errorMessage: 'Currently Printing Different User.'});
            return;
        } else {
            fs.writeFile(path, '', () => { console.log('File Created'); });
            fs.unlinkSync(path);        
            res.status(200).json({statusCode: 200, statusMessage: 'Here we go'});
            return;
        }
    });
})

Какмогу ли я заставить Firebase распознать возвращенный 404 как неудавшийся вызов, а также подождать, пока вызов не будет завершен, прежде чем он вернет ok или сбой.

API работает правильно с Почтальоном, но не когда данные публикуются через Firebase.Кто-нибудь сталкивался с этим раньше, или кто-нибудь может увидеть, что я делаю неправильно?

Данные анализируются на подачу, но только после того, как Firebase вернул 'ok', даже если я намеренно вызвал ошибку.

Мне нужно это на месте, чтобы можно было использовать функцию повтора функции облака Firebase.

Изображения можно увидеть @ https://imgur.com/a/1qYxrci

1 Ответ

0 голосов
/ 24 октября 2018

Облачная функция возвращает результат до завершения вызова, поскольку вы не возвращаете обещание, возвращенное вызовом запроса-обещания.

Изменение кода следующим образом должно помочь (по крайней мере, для этого).проблема):

exports.sendUser = functions.firestore
  .document('user/{userId}')
  .onCreate((snap, context) => {

    const data = snap.data();
    const options = {
      method: 'POST',
      uri: 'http://' + ip + ':' + port + '/user',
      body: data,
      json: true,
    };

    return rp(options) // <-- See the change here  
      .then(function (parsedBody) {
        console.log('TEN ', parsedBody);
        return parsedBody;
      })
      .catch(function (err) {
        console.log('ERR ', err);
        return err;
      });
  });

Я бы посоветовал вам посмотреть официальную серию видео (https://firebase.google.com/docs/functions/video-series/)), которая очень хорошо объясняет этот момент о возврате обещаний для фоновых функций (в частности, названных «Изучите обещания JavaScript»).").

...