当我从命令行通过node server.js
运行我的服务器时,它运行方式不同(特别是推送通知工作)比使用upstart脚本启动它时。我该如何修改我的upstart脚本来解决这个问题?
这是一个示例服务器,其中推送在upstart中失败而在命令行中成功
var apn = require('apn');
var options = {
passphrase:'certpassphrase'
};
var err = null;
var apnConnection = new apn.Connection(options);
apnConnection.on('error', function(error){
console.log("apscallback", 1, error);
});
apnConnection.on('transmitted', function(notification){
console.log("apscallback", 2);
console.log(notification);
});
apnConnection.on('timeout', function(){
console.log("apscallback", 3);
});
apnConnection.on('connected', function(){
console.log("apscallback", 4);
});
apnConnection.on('disconnected', function(){
console.log("apscallback", 5);
});
apnConnection.on('socketError', function(error){
console.log("apscallback", 6, error);
});
apnConnection.on('transmissionError', function(errorCode, notification){
console.log("apscallback", 7, errorCode);
});
apnConnection.on('cacheTooSmall', function(difference){
console.log("apscallback", 8);
});
function sendTestNotification() {
var deviceToken = 'mydevicetoken';
var myDevice = new apn.Device(deviceToken);
var note = new apn.Notification();
note.expiry = Math.floor(Date.now() / 1000) + 60; // Expires 1 hour from now.
// note.badge = 3;
// note.sound = "ping.aiff";
// note.alert = "\uD83D\uDCE7 \u2709 You have a new message";
note.payload = {'message': 'somemessage', 'requester': 7};
apnConnection.pushNotification(note, myDevice);
}
sendTestNotification();
http.listen(port, function(){
console.log('listening on *:', port);
});
以及我的upstart脚本的样子:
#!upstart
description "My Server"
start on started mountall
stop on shutdown
# Automatically Respawn:
respawn
respawn limit 99 5
env NODE_ENV=production
chdir /home/user/my-server/
exec node /home/user/my-server/server.js >> /var/log/my-server.log 2>&1
我得到的错误是:
...
apscallback 4
apscallback 5
apscallback 1 [Error: Socket unusable after connection. Hint: You may be using a certificate for the wrong environment]
... (REPEATS)
答案 0 :(得分:2)
您在upstart脚本中设置了env NODE_ENV=production
(默认情况下,如果未设置此项,则APN将针对测试/沙箱环境,如果未设置该变量)。所以这将违背生产APN。您是否拥有适当的证书(沙箱和生产证书不同)?
答案 1 :(得分:0)
您的新手脚本可能默认为root。也许root在其密钥环中没有合适的证书。尝试在upstart脚本中隐式设置用户。
您应该可以使用setuid <username>