Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将html和js的临时块发送到node.js上正在运行的应用程序_Node.js_Express - Fatal编程技术网

如何将html和js的临时块发送到node.js上正在运行的应用程序

如何将html和js的临时块发送到node.js上正在运行的应用程序,node.js,express,Node.js,Express,我刚刚在Node.js上启动并运行了我的第一个应用程序。到目前为止,它只是提供一个静态文件。但我有一些想法将在未来实施,因此我将继续进行节点设置,以便在时机成熟时做好准备 // get modules var express = require('express'); var fs = require('fs'); // create app instance var app = express(); // static files middleware app.use("/assets",

我刚刚在Node.js上启动并运行了我的第一个应用程序。到目前为止,它只是提供一个静态文件。但我有一些想法将在未来实施,因此我将继续进行节点设置,以便在时机成熟时做好准备

// get modules
var express = require('express');
var fs = require('fs');

// create app instance
var app = express();

// static files middleware
app.use("/assets", express.static(__dirname + '/assets'));

// main route
app.get('/', function(req, res) {
    var html = fs.readFileSync('assets/views/main.html', 'utf8');
    res.send(html);
});

// make web server listen on specific port
app.listen(8080);
注意:我意识到我不需要特快专车服务一条路线,但我想在这条路线上领先有什么害处?!:)

我的第一个想法是想办法让当前使用该应用的所有用户都知道已经有了更新,他们必须刷新他们的浏览器。没有必要保存应用程序的当前状态,因为它非常基本

所以,如果我是一个用户,我正在使用应用程序和boom,我会收到一个非常小的模式窗口警报通知,让我知道我需要刷新

此外,如果某些用户在我发送警报后加载应用程序,则该用户根本不会看到警报(因为他们应该已经看到新的更改)

我在谷歌上搜索过这个主题,我只是对我找到的例子不满意。我不想更新notifications.xml文件(node.js将监视该文件)来推送新通知

我能想到的一个解决方案是,制作一个可以从命令行执行的命令,该命令将(以某种方式)向应用程序发送新通知。也许使用Grunt.js之类的东西(我不确定它是否适合这个,因为我从未使用过它)。基本上,一旦通知被发送,它的所有痕迹都应该消失。这就是为什么我认为命令行方法会很好

我的问题是:一般来说,我应该如何实现这样的东西?我是Node.js新手,但我对javascript和命令行非常熟悉

请随时提供您认为对我更合适的任何替代解决方案(命令行方法除外),或者您认为可以帮助我的任何工具


谢谢

如果要将更新推送到web客户机,一种方法是使用类似的工具。这将在客户端和服务器之间创建一个双向管道,您可以使用该管道异步推送更新

示例服务器:

var app = require('express').createServer()
  , io = require('socket.io').listen(app);

app.listen(80);

app.get('/', function (req, res) {
  res.sendfile(__dirname + '/index.html');
});

io.sockets.on('connection', function (socket) {
  socket.emit('news', { hello: 'world' });
  socket.on('my other event', function (data) {
    console.log(data);
  });
});
示例客户端:

<script src="/socket.io/socket.io.js"></script>
<script>
  var socket = io.connect('http://localhost');
  socket.on('news', function (data) {
    alert('New news has come in! Please refresh your page!');
    socket.emit('my other event', { my: 'data' });
  });
</script>

var socket=io.connect('http://localhost');
socket.on('news',函数(数据){
警报('有新消息!请刷新您的页面!');
emit('my other event',{my:'data'});
});

另一个选项是使用Javascript从客户端轮询以主动查找更新。您需要在服务器上为每个客户端保留一些状态,以确定该客户端是否需要更新。然后,客户端将在某个计时器间隔(例如,每秒一次)向辅助路由发出get请求,服务器将回答“是,您需要更新”或“否,您不需要更新”。如果是,客户端Javascript将弹出您的模式框并告诉用户刷新

好的,很好。因此,我可以在服务器上执行类似的操作:
socket.emit('notify',{action:'refresh'})
(或类似操作)。但是,在不更新server.js和重新启动节点服务器的情况下,如何“按需”执行此操作?是否有Socket.io的命令行实用程序?您只需要与服务器通信,而不是实际更改代码。您可以通过多种不同的方式与节点服务器通信:将数据发布到路由、让节点监视文件更改、让节点侦听队列并向队列添加作业(对于队列来说,Redis.io是一个不错的选择)。在节点服务器中创建路由并向其发布可能是最简单的方法。我明白了。我已经在我的节点服务器中创建了一个POST路由。我能够从命令行使用curl与节点服务器“对话”。所以我很高兴!:)谢谢你的帮助!不要使用fs.readFileSync,它正在阻塞!在node:-)@supernova中阻止的一切都是邪恶的,如果它是邪恶的,为什么它会出现在API中?readFileSync最好用于在启动或其他初始化过程中只调用一次的情况。当您在路由中使用它时,基本上是在文件读取完成之前(这是一段很长的时间)占用nodejs线程。由于nodejs是单线程的,因此在此过程中,节点服务器将无法响应任何其他请求。基本上,您已经将您的服务器从能够处理1000个并发用户减少到只有1个并发用户。@Bill-当您说“在启动或其他初始化期间”,您是指服务器启动/u server\u初始化吗?或者你是说别的什么?对不起,如果这是一个愚蠢的问题,我是新来的。:)在节点服务器开始处理用户请求之前启动节点服务器时(即运行
Node script.js
)。