Javascript 如何更新服务器';在不重新启动的情况下恢复内容?(node.js)
因此,我有一个简单的node.js服务器,它只提供动态内容:Javascript 如何更新服务器';在不重新启动的情况下恢复内容?(node.js),javascript,node.js,express,Javascript,Node.js,Express,因此,我有一个简单的node.js服务器,它只提供动态内容: // 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(""+
// 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);
它可以工作,但如果我更新lib.js,它不会更新。它似乎在复制该功能。然后我试着
// app.js
var app = require('express')();
app.get('/message/:poster', function(request, response) {
require('./lib.js').message(request, response);
})
app.listen(2345);
但这也不会更新。似乎该函数会一直被缓存和重用(一旦启动服务器)。我敢说,必须有一种方法来设置它,以便它可以每次重新验证函数(检查包含它的文件是否更改),如果是,则更新其缓存,或者我们可以将它设置为每n次更新函数,或者更好,因为我们在节点中,有一个事件监听器,用于更改包含函数的文件,并在函数更改时触发事件并更新缓存中的函数。
那么,我们如何获得上述行为之一?还是别的什么?我知道重新启动服务器可能只需要100毫秒,但重新启动它会中断所有当前活动的WebSocket,这不是一个选项。
注意:我不想使用任何模板语言,如jade、ejc等。如果您不想在生产中丢失任何请求,请使用PM2、Forever等优雅地重新启动您的应用程序。 如果您想在开发中自动应用更改,请使用Nodemon。
我不知道您不喜欢重新启动应用程序的任何其他原因。将内容导出到其他模块似乎是解决此要求的好方法。但问题是:模块只实例化一次并缓存以供以后的请求使用,这就是为什么在更新lib.js时它不会反映更新的内容 您正在寻找的是热加载node.js模块的一种方法,它可以在每次模块更改时获得新的模块实例。你可以用 对于要跟踪更改的任何模块:
module.change_code = 1;
通过要求一个模块,它的
module.exports
将被缓存,以便将来调用require
。您可以通过编程方式清空缓存:。如果您还想在文件更改时执行此操作,您可以使用fs.watch
:。您能不能不使用NodeJ的读/写API
请求->读取文件->向客户端发送内容
至少对于html这样的静态内容。它确实会重新加载,WebSocket也会丢失并非所有服务器端应用程序都是PM2的“零秒停机”所使用的那种……只需使用fs.readFile()而不是require()
// app.js
var app = require('express')();
app.get('/message/:poster', function(request, response) {
require('./lib.js').message(request, response);
})
app.listen(2345);
require('hotswap');
module.change_code = 1;