Ошибка R10 (время ожидания загрузки) при запуске firebase node.js на Героку

#node.js #firebase #firebase-cloud-messaging

#node.js #firebase #firebase-облако-обмен сообщениями

Вопрос:

У меня есть node.js код, похожий на этот:

 var firebase = require('firebase');
var request = require('request');

var API_KEY = "..."; // Your Firebase Cloud Server API key

firebase.initializeApp({
  serviceAccount: ".json",
  databaseURL: "https://.firebaseio.com/"
});
ref = firebase.database().ref();

function listenForNotificationRequests() {
  var requests = ref.child('notificationRequests');
  ref.on('child_added', function(requestSnapshot) {
    var request = requestSnapshot.val();
    sendNotificationToUser(
      request.username, 
      request.message,
      function() {
        request.ref().remove();
      }
    );
  }, function(error) {
    console.error(error);
  });
};

function sendNotificationToUser(username, message, onSuccess) {
  request({
    url: 'https://fcm.googleapis.com/fcm/send',
    method: 'POST',
    headers: {
      'Content-Type' :' application/json',
      'Authorization': 'key=' API_KEY
    },
    body: JSON.stringify({
      notification: {
        title: message
      },
      to : '/topics/user_' username
    })
  }, function(error, response, body) {
    if (error) { console.error(error); }
    else if (response.statusCode >= 400) { 
      console.error('HTTP Error: ' response.statusCode ' - ' response.statusMessage); 
    }
    else {
      onSuccess();
    }
  });
}

// start listening
listenForNotificationRequests();
  

Мой вопрос в том, как запустить его на heroku? Когда я пытаюсь, это выдает ошибку R10 (время ожидания загрузки) -> веб-процессу не удалось выполнить привязку к $PORT в течение 60 секунд после запуска. Procfile выглядит следующим образом:

 worker: node server.js
  

Ответ №1:

Вот мое предположение:

Вероятно, в вашем коде есть что-то похожее на это (просто не опубликовано):

 var http = require('http');
http.createServer(server.js);
server.listen(5000);
  

Ну, это server.listen(5000); заставляет приложение подключаться к порту 5000 и прослушивать.

Heroku так не работает.Он автоматически назначит ваш порт env и будет использовать его. Итак, вам нужно сообщить своему приложению: «Эй, используй env порт или используй 5000 в качестве резервной копии». Вы можете сделать это следующим образом:

 server.listen(process.env.PORT || 5000);
  

Опять же, это всего лишь предположение, учитывая, что вы не опубликовали свой код, который ссылается на номер порта. Мой пример может отличаться от вашего, но это та же общая концепция.

Комментарии:

1. Мой код также не использует порты. В противном случае я бы изменил его, я попробую ваше предложение и посмотрю, как оно пойдет.

Ответ №2:

Я исправил это следующим образом:

 //add this in the begining

var express = require('express');

var app = express();

app.set('port', (process.env.PORT || 5000));

//this at the end

app.listen(app.get('port'), function() {
  listenForNotificationRequests();
});
  

Комментарии:

1. Я знал, что это проблема, но это код, который люди должны использовать, если столкнутся с этим.