您好我正在编写一个简单的nodejs推送通知服务器,该服务器基本上是读取动态编辑的json文件并将其内容推送到客户端。
UPDATE:如果删除like data = JSON.parse(data),它的工作正常;任何人都可以澄清吗?
我每5秒使用python编辑一次json文件。但每次我运行python循环来编辑文件时,Node Server都会崩溃。但是,如果我在while循环中单独运行相同的代码,那么Node Server就可以正常运行。
我收到节点服务器的以下错误
debug - cleared heartbeat timeout for client c_u5Oi1eGnwaDerGREMD
debug - set heartbeat interval for client c_u5Oi1eGnwaDerGREMD
{"sample": {"name": "Shubhanshu Mishra100", "networks": ["facebook", "twitter",
"linkedin"]}}
debug - websocket writing 5:::{"name":"notification","args":[{"sample":{"name
":"Shubhanshu Mishra100","networks":["facebook","twitter","linkedin"]},"time":"2
012-10-09T11:24:55.588Z"}]}
{"sample": {"name": "Shubhanshu Mishra100", "networks": ["facebook", "twitter",
"linkedin"]}}
debug - websocket writing 5:::{"name":"notification","args":[{"sample":{"name
":"Shubhanshu Mishra100","networks":["facebook","twitter","linkedin"]},"time":"2
012-10-09T11:24:55.589Z"}]}
{"sample": {"name": "Shubhanshu Mishra200", "networks": ["facebook", "twitter",
"linkedin"]}}
debug - websocket writing 5:::{"name":"notification","args":[{"sample":{"name
":"Shubhanshu Mishra200","networks":["facebook","twitter","linkedin"]},"time":"2
012-10-09T11:25:00.598Z"}]}
{"sample": {"name": "Shubhanshu Mishra200", "networks": ["facebook", "twitter",
"linkedin"]}}
debug - websocket writing 5:::{"name":"notification","args":[{"sample":{"name
":"Shubhanshu Mishra200","networks":["facebook","twitter","linkedin"]},"time":"2
012-10-09T11:25:00.619Z"}]}
undefined:0
^
SyntaxError: Unexpected end of input
at Object.parse (native)
at F:\My Codes\NodeJs\PushNotification\server.js:25:16
at fs.readFile (fs.js:176:14)
at Object.oncomplete (fs.js:297:15)
我正在使用Node.js中的以下代码
读取response.json文件io.sockets.on('connection', function(socket){
fs.watch('response.json', function(curr, prev){
fs.readFile('response.json', 'utf8', function(err, data){
if(err) throw err;
console.log(data);
data = JSON.parse(data);
data.time = new Date();
socket.volatile.emit('notification', data);
});
});
});
UPDATE:如果删除like data = JSON.parse(data),它的工作正常;任何人都可以澄清吗?
当我单独调用我的python脚本时,我的python代码是:
import json
import time
jsonStr = {
"sample": {
"name": "Shubhanshu Mishra",
"networks": [
"facebook",
"twitter",
"linkedin"
]
}
}
i = 0
jsonStr['sample']['name'] = "Shubhanshu Mishra" + str(i);
fStr = json.dumps(jsonStr)
with open('response.json', 'w') as f:
f.write(fStr)
f.closed
然而,当我在睡眠时间为5秒的while循环中包含相同的代码时,我得到上述错误。我的while循环代码是:
while True:
i += 100
print i
jsonStr['sample']['name'] = "Shubhanshu Mishra" + str(i);
fStr = json.dumps(jsonStr)
#f = open("response.json", "w")
with open('response.json', 'w') as f:
f.write(fStr)
f.closed
#f.write(fStr)
print "Written to file: " + fStr
#f.close()
time.sleep(5)
看到
答案 0 :(得分:2)
这是怎么回事:Python首先清除文件然后写字符串来编写文件。一旦文件被清除,节点就会触发事件,并读取(空)文件。然后,尝试JSON解析空字符串,就会出错。
问题是,当你手动运行简单的python脚本(没有while循环)时,为什么不会发生这种情况。我不确定,但我认为这与各种竞争条件有关,主要区别在于在循环中,在写入文件之后,它会打印一些东西,然后睡一些,在另一个中它只是退出。如果您在免费脚本手册中添加打印和睡眠时,如果您遇到相同(崩溃)行为,我也不会感到惊讶。
那么,如何解决这个问题。一个不太好,但工作方法是添加一个小睡眠,以允许写完成:
io.sockets.on('connection', function(socket){
fs.watch('response.json', function(curr, prev){
setTimeout(function () {
fs.readFile('response.json', 'utf8', function(err, data){
if(err) throw err;
console.log(data);
data = JSON.parse(data);
data.time = new Date();
socket.volatile.emit('notification', data);
});
}, 50);
});
});
因为我希望你从fs.watch
得到2个回调,更好的方法是通过下划线去掉它们(实际上忽略了第一个):
var _ = require("underscore");
io.sockets.on('connection', function(socket){
fs.watch('response.json', _.debounce(function(curr, prev){
fs.readFile('response.json', 'utf8', function(err, data){
if(err) throw err;
console.log(data);
data = JSON.parse(data);
data.time = new Date();
socket.volatile.emit('notification', data);
}), 50);
});
});
我认为如果你忽略错误,它甚至会像你期望的那样工作(因为在fs.watch
的第二次回调中,文件将包含正确的数据)。
然而,最后,我认为这不是将新数据投入正在运行的程序的方法。我会使用以下方法之一: