我有类似于这个的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
答案 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();
});