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

Posted

技术标签:

【中文标题】在 Heroku 上运行 firebase node.js 时出现错误 R10(启动超时)【英文标题】:Error R10 (Boot timeout) when running firebase node.js on Heroku 【发布时间】: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

【问题讨论】:

【参考方案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();
);

【讨论】:

我知道这是问题所在,但这是人们遇到这种情况时应该使用的代码。

以上是关于在 Heroku 上运行 firebase node.js 时出现错误 R10(启动超时)的主要内容,如果未能解决你的问题,请参考以下文章

当我尝试启动应用程序时,在heroku中“无法确定Firebase数据库URL”错误是什么意思?

Firebase Angular 应用程序未连接 Heroku 上的 h NodeJS 应用程序

需要 Firebase JSON 的 Django 应用程序的 Heroku 配置?

使用 firebase privateKey 作为 Heroku 配置变量的转义问题

免费在 Heroku 上运行延迟作业

使用参数在 Heroku 上运行 rake 任务并指定 Heroku 应用程序