Я пишу приложение, где сервер будет автоматически отправлять новые данные, как только содержимое файла будет изменено, и браузер должен отобразить его. Тем не менее, мне нужно каждый раз «обновлять», чтобы узнать, что такое новые данные. вот код клиента:node.js получить новые данные без обновления
<script>
var socket = io.connect('http://192.168.1.91:8070');
socket.on('news', function (data) {
console.log(data);
document.forms['test form'].elements["txtStatus"].value = data;
});
</script>
и вот код сервера:
var http = require('http');
var io = require('/home/pi/node/lib/node_modules/socket.io');
var server;
var fs = require('fs');
server = http.createServer(function(req, res){
res.writeHead(200, {'Content-Type': 'text/html'});
res.write('My first node app.');
res.end();
}),
server.listen(8070);
var io = io.listen(server);
var prev_text;
var text = fs.readFileSync('./current_temp','utf8');
io.sockets.on('connection', function (socket) {
socket.emit('news', text);
fs.watchFile('./current_temp', function (curr, prev) {
text = fs.readFileSync('./current_temp','utf8');
if(prev_text != text){
prev_text = text;
socket.emit('news', text);
console.log("text is :"+text);
}
});
});
это weired, потому что иногда это работает, но в большинстве случаев это не когда я тестирую его. Я понятия не имею, что заставляет его работать. Кроме того, я намеревался, что watchFile kindda помещает эту программу в цикл, из которого я могу создавать испускания, как только изменяется содержимое файла.
Также любые другие комментарии приветствуются по поводу этого кода. Я новичок в sockets.io и node.js, и поэтому может не делать что-то правильно ... Спасибо заранее за ответ.
Вопрос еще раз, как я могу сделать его таким образом, чтобы браузер обновлял данные без обновления на стороне клиента.
Одно замечание общего характера заключается в том, что вы должны избегать как можно большего количества функций синхронизации, особенно readFileSync. Node.js не блокируется, и как вы его используете, вы блокируете весь сервер (однопоточный, помните?), Пока этот файл не будет прочитан. Не очень классный для производительности. – Zlatko
Кроме того, я думаю, что ваша проблема может заключаться в том, что вы хотите вытащить переменную сокета, чтобы она не срабатывала как с обратным вызовом watchFile, так и с обратным вызовом socket.on ('connection'). А также, я бы посмотрел на модели того, когда это работает. Если вы попытаетесь сохранить изменения файла перед первым подключением, работает ли обновление? Или только один раз после первого подключения к socket.io? – Zlatko
Вы правы в сохранении изменений, он работает в одном из случаев, но я не могу понять, когда, я просто видел его пару раз. Что касается вытаскивания гнезда из socket.on, я попытался, но это не сработало. вот что я пробовал: var global_sock; io.sockets.on ('connection', function (socket) { \t global_sock = socket; }); global_sock.emit ... но по какой-то причине это не сработало. возможно, вы могли бы рассказать мне, как вытащить его? – user3299502