所以我有一个简单的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(""+
"<!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它不会更新。它似乎正在制作该功能的副本 然后我试了
// app.js
var app = require('express')();
app.get('/message/:poster', function(request, response) {
require('./lib.js').message(request, response);
})
app.listen(2345);
但是这也没有更新。
似乎这个函数一直被缓存和重用(一旦我启动服务器)。我敢说必须有一种方法来设置它,以便它每次重新验证函数(检查包含它的文件是否更改),如果是这样更新其缓存,或者我们可以将其设置为每n次更新函数时间,甚至更好,因为我们在节点中,有一个事件监听器来更改包含该功能的文件,并且随着功能的改变,事件触发和缓存中的功能得到更新。
那么我们如何得到上述行为之一呢?或者是其他东西?我知道重新启动服务器可能只需要100毫秒,但重新启动它会中断所有当前活动的websockets,这不是一个选项。
注意:我不想使用任何模板语言,如jade,ejc等。
答案 0 :(得分:9)
通过要求模块module.exports
缓存,以便将来调用require
。您可以通过编程方式清空缓存:http://nodejs.org/docs/latest/api/globals.html#globals_require_cache。如果您还想在更改文件时执行此操作,则可以使用fs.watch
:http://nodejs.org/api/fs.html#fs_fs_watch_filename_options_listener。
答案 1 :(得分:1)
如果您不想在生产中丢失任何请求 - 只需使用PM2,Forever等优雅重启您的应用程序。 如果要在开发中自动应用更改 - 请使用Nodemon。 我不知道你不喜欢重启app的任何其他原因。
答案 2 :(得分:0)
将内容导出到其他模块似乎是解决此要求的好方法。但问题是:模块只被实例化一次并缓存以供以后的请求使用,这就是为什么当你更新lib.js时它并没有反映更新的内容。
你在寻找什么是一种热加载node.js模块的方法,以便在每次更改时获取模块的新实例。您可以使用node-hotswap
require('hotswap');
以及您要跟踪更改的任何模块:
module.change_code = 1;
答案 3 :(得分:0)