【问题标题】:Error R10 (Boot timeout) when running firebase node.js on Heroku在 Heroku 上运行 firebase node.js 时出现错误 R10(启动超时)
【发布时间】:2017-02-15 18:49:34
【问题描述】:

我有类似这个的 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 上运行它?当我尝试时,它给了我 Error R10 (Boot timeout) -> Web 进程在启动后 60 秒内无法绑定到 $PORT。 Procfile是这样的:

worker: node server.js

【问题讨论】:

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


    【解决方案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);
    

    同样,考虑到您没有发布引用端口号的代码,这只是一个猜测。我的示例可能与您的示例不同,但总体概念相同。

    【讨论】:

    • 我的代码也不使用端口。否则我会改变它,我会尝试你的建议,看看效果如何。
    【解决方案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();
    });
    

    【讨论】:

    • 我知道这是问题所在,但这是人们遇到这种情况时应该使用的代码。
    猜你喜欢
    • 2019-09-07
    • 1970-01-01
    • 2014-01-13
    • 2012-05-15
    • 2015-08-15
    • 2014-03-24
    • 1970-01-01
    • 2021-11-29
    • 2019-06-01
    相关资源
    最近更新 更多