Выполнение функции заняло 60012 мс, завершено со статусом «тайм-аут». - PullRequest
0 голосов
/ 26 мая 2020

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

Среда разработки:

  • Firebase Realtime DB: план Blaze. Новая запись в БД запускает функцию облака.
  • Функция облака Firebase: ax ios 0.19.2, firebase-admin 8.10.0, firebase-functions 3.6.1.
  • Backend: node v12.14.1, http://XXX.XXX.X.XX: 3000

Ожидаемые результаты: POST-вызов из Firebase Cloud Function запускает маршрут в node.js backend для обработки данных, полученных при вызове POST.

Фактический результат: вызов POST никогда не достигает node.js серверной части, запущенной в данный момент на локальном компьютере. Войдите в консоль Firebase Cloud Functions:

Выполнение функции заняло 60012 мс, завершено со статусом: 'timeout'

Что я пробовал до сих пор?

  • POST-вызов из POSTMAN без проблем достигает моего бэкэнда.
  • Замена ax ios на request-prom-native для выполнения POST-вызова.
  • Замена http://XXX.XXX.X.XX: 3000 by http://localhost: 3000 .
  • Использование .then (). Catch () синтаксиса ax ios.
  • Использование asyn c синтаксис await для ax ios со структурой try & catch.

Код функции Firebase Cloud:

const functions = require('firebase-functions');
const axios = require('axios');
const admin = require('firebase-admin');
admin.initializeApp();

const BACKEND_URL = 'http://XXX.XXX.X.XX:3000';

exports.triggerNotification = functions.database.ref('/sessions/{sessionID}/{message}')
  .onCreate(function(snapshot, context) {
    const createdContent = snapshot.val();
    const config = { headers: { 'Content-Type': 'application/json' } };
    if (!createdContent) {
      return;
    }
    return axios.post(`${BACKEND_URL}/notification/trigger`, { createdContent } ,config);
  });

Node.js Backend code:

router.post('/trigger', function (req, res) {
  console.log('req.body', req.body);
  res.status(200).send('Post request received');
}); 

1 Ответ

2 голосов
/ 26 мая 2020

Похоже, вы используете IP-адреса, а серверная часть работает на вашем локальном компьютере, поскольку вы пробовали localhost, и он отформатирован таким образом в вашем коде. Вы говорите, что почтальон работает, но пытаетесь ли вы это сделать из-за пределов своей сети? Я предполагаю, что соединение блокируется. Можете ли вы попробовать такую ​​службу, как ngrok, которая предоставляет доступ к локальному серверу? Также обязательно попробуйте это с https

...