如何在不重新启动的情况下更新服务器的内容? (的node.js)

所以我有一个简单的node.js服务器,它只提供dynamic内容:

// app.js var app = require('express')(); app.get('/message/:poster', function(request, response) { response.writeHeader(200, {'content-type': 'text/html'}); // some database queries response.end(""+ "<!DOCTYPE html>"+ "<html>"+ "<head>"+ "<title>messages of "+request.params.poster+"</title>"+ "<script src='http://example.com/script.js'></script>"+ "<link rel='stylesheet' href='http://example.com/style.css'>"+ "</head>"+ "<body>"+ "" // and so on ); }) app.listen(2345); 

现在,假设我想更新我的HTML。
并进一步假设我不想重新启动服务器。
有没有办法实现这一点?

我试图导出部分发送到外部文件,如:

 // lib.js module.exports.message = function(request, response) { response.writeHeader(200, {'content-type': 'text/html'}) //some database queries response.end(""+ "<!DOCTYPE html>"+ "<html>"+ "<head>"+ "<title>messages of "+request.params.poster+"</title>"+ "<script src='http://example.com/script.js></script>"+ "<link rel='stylesheet' href='http://example.com/style.css'>"+ "</head>"+ "<body>"+ "" //and so on ); } 

 // app.js var app = require('express')(); app.get('/message/:poster', require('./lib.js').message) app.listen(2345); 

它的工作原理,但如果我更新lib.js它不会更新。 它似乎正在制作该function的副本。
然后我试了一下

 // app.js var app = require('express')(); app.get('/message/:poster', function(request, response) { require('./lib.js').message(request, response); }) app.listen(2345); 

但是这也不更新。
似乎这个函数一直被caching和重用(一旦我启动服务器)。 我敢说,必须有一种方法来设置它,以便每次重新validation函数(检查包含它的文件是否改变),如果是,则更新它的caching,或者我们可以设置它来更新函数每n个时间,甚至更好,因为我们在节点中,有一个事件监听器来更改包含该函数的文件,并随着函数的改变,事件触发和caching中的函数被更新。
那么,我们如何获得上述行为之一呢? 或者是其他东西? 我知道重新启动服务器可能只需要100ms,但重新启动它会中断所有当前活动的WebSocket,这不是一个选项。
注意:我不想使用任何模板语言如玉,ejc等

通过要求一个模块的module.exportscaching所有将来的调用require 。 您可以编程清空caching: http : //nodejs.org/docs/latest/api/globals.html#globals_require_cache 。 如果您另外想要在文件更改时执行此操作,则可以使用fs.watch

如果你不想在生产中丢失任何请求 – 只要使用PM2,Forever等来重新启动你的应用程序。如果你想在开发中自动应用你的更改 – 使用Nodemon。 我不知道为什么你不喜欢重新启动应用程序的其他原因。

将内容导出到其他模块似乎是解决此问题的好方法。 但问题是:模块只是实例化一次,并为以后的请求caching,这就是为什么当你更新lib.js它不反映更新的内容。

你在找什么是一个热载入node.js模块的方法,每当它发生变化时,都会得到一个新的模块实例。 你可以使用node-hotswap

 require('hotswap'); 

并为任何模块,你想跟踪更改:

 module.change_code = 1; 

你能不能只使用nodejs的读/写API?

http://nodejs.org/api/fs.html

请求 – >读取文件 – >发送内容到客户端

至less用于html的静态内容。