在Heroku上运行firebase node.js时出现错误R10(引导超时)

时间:2016-10-06 21:29:33

标签: node.js firebase firebase-cloud-messaging

我有类似于这个的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(启动超时) - > Web进程在启动后60秒内无法绑定到$ PORT。 Procfile是这样的:

worker: node server.js

2 个答案:

答案 0 :(得分:0)

以下是我的猜测:

你的代码中可能有类似的东西(只是没有发布):

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 :(得分:0)

我解决了这个问题:

//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();
});