我有一个node-apn nodejs脚本在AmazonWS上作为守护进程运行。守护进程运行得很好,脚本继续运行并在它关闭时返回,但我相信我在使用node.js时遇到了同步执行和退出问题。当我使用process.exit()释放进程时,即使所有的console.logs输出都说它们已经发送了我的消息,但是电话上从来没有收到过它们。我决定删除出口,让进程在执行和所有消息都成功发送后“挂起”。这导致我使用ASYNC函数执行了以下实现,但似乎也出现了相同的结果。有人能提供这方面的见解吗?没有从APN或其他任何地方抛出错误。
function closeDB()
{
connection.end(function(err) {
if (err) {
console.log("ERROR: " + util.inspect(err, false, 5));
process.exit(1);
}
console.log("APNS-PUSH: COMPLETED.");
});
setTimeout(function(){process.exit();}, 50);
} // End of closeDB()
function apnsError(err, notification)
{
console.log(err);
console.log(notification);
closeDB();
}
function async(arg, callback)
{
apnsConnection.sendNotification(arg);
console.log(arg);
setTimeout(function() { callback(1); }, 100);
}
/**
* Our MySQL query callback.
*/
function queryCB(err, results)
{
//error in our all, report and exit
if (err) {
console.log("ERROR: " + util.inspect(err, false, 5));
closeDB();
}
if(results.length == 0)
{
closeDB();
}
var notes = [];
var count = 0;
try {
for( var i = 0; i < results.length; i++ ) {
var myDevice = new apns.Device(results[i]['udid']);
var note = new apns.Notification();
note.expiry = Math.floor(Date.now() / 1000) + 3600; // Expires 1 hour from now.
note.badge = results[i]["notification_count"];
note.sound = "ping.aiff";
note.alert = results[i]["message"];
note.device = myDevice;
connection.query('UPDATE `tbl_notifications` SET `sent`=1 WHERE `id`=' + results[i]["id"] , function(err, results) {
if(err)
{
console.log("ERROR: " + util.inspect(err, false, 5));
}
});
notes.push(note);
}
} catch( err ) {
console.log('error: ' + err)
}
console.log(notes.length);
notes.forEach(function(nNode) {
async(nNode, function(result) {
count++;
if(count == notes.length) {
closeDB();
}
})
});
} // End of queryCB()发布于 2013-05-31 02:28:06
我也遇到了同样的问题,杀死进程也会杀死打开的套接字连接,并且不允许发送通知。我提出的解决方案不是一个理想的解决方案,但它也适用于你的情况。我查看了node-apn代码,发现Connection对象继承自EventEmitter,因此您可以像这样监视该对象上的事件:
var apnsConnection = new apn.Connection(options)
apnsConnection.sendNotification(notification)
apnsConnection.on('transmitted', function(){
console.log("Transmitted")
callback()
})
apnsConnection.on('error', function(){
console.log("Error")
callback()
})这是监控发送通知的套接字,所以我不知道它在确定通知何时成功传递到Apple的APNS服务器时有多准确,但它对我来说工作得很好。
发布于 2013-06-05 22:03:19
您看到这个问题的原因是,当您使用#pushNotification时,它会在模块中缓冲通知并处理异步发送。
侦听“已传输”是有效的,并在通知已写入套接字时发出。但是,如果您的目标是在发送完所有通知后关闭套接字,则实现此目的的最简单方法是在创建连接时使用connectionTimeout属性。
只需将connectionTimeout设置为大约1000 (毫秒),并假设您没有打开任何其他连接,则该进程将自动退出。或者,您可以在timeout事件上设置一个事件侦听器并从那里调用process.exit()。
https://stackoverflow.com/questions/13202772
复制相似问题