为什么这几个文件在Nodejs中只执行一次
为什么这几个文件在Nodejs中只执行一次
小弟初学node.js写了几个文件
第一个是入口文件index.js
var http = require(’./server’); var rouser = require(’./rouse’); var head = {}; head[’/’]=rouser.start; head[’/start’]=rouser.start; head[’/upload’]=rouser.upload; http.server(rouser.rouse,head); 第二个文件 server.js
var http = require(‘http’); var url = require(‘url’);
function server(rouse,head){ function ser(req,res){ var urls = url.parse(req.url).pathname; var aa = rouse(urls,head); res.write(aa); //res.write(req.url); res.end(); } http.createServer(ser).listen(‘3000’); }
exports.server=server; 第三个文件 rouse.js文件
function rouse(urls,head){ return headurls; } function upload(){ return “Hello upload”; } function start(){ return “Hello Start”; } exports.rouse = rouse; exports.start = start; exports.upload = upload; 这几个文件 我用cmd运行index.js 运行第一次正常 在运行一次就无法找到了 求高手告知怎么回事 小弟在此谢过
要理解为什么这几个文件在Node.js中只执行一次,我们需要了解Node.js的模块机制。Node.js中的模块是单例的,也就是说,一个模块只会被加载一次,即使你在多个地方使用require
来引入它。这意味着,模块中的变量和函数都是共享的,并且只会初始化一次。
示例代码分析
index.js
var http = require('./server');
var rouser = require('./rouse');
var head = {};
head['/'] = rouser.start;
head['/start'] = rouser.start;
head['/upload'] = rouser.upload;
http.server(rouser.rouse, head);
server.js
var http = require('http');
var url = require('url');
function server(rouse, head) {
function ser(req, res) {
var urls = url.parse(req.url).pathname;
var aa = rouse(urls, head);
res.write(aa);
// res.write(req.url); // 去掉注释后会报错,因为res.write需要一个字符串或Buffer
res.end();
}
http.createServer(ser).listen('3000');
}
exports.server = server;
rouse.js
function rouse(urls, head) {
return head[urls];
}
function upload() {
return "Hello upload";
}
function start() {
return "Hello Start";
}
exports.rouse = rouse;
exports.start = start;
exports.upload = upload;
问题分析
当你运行index.js
时,server.js
和rouse.js
会被加载并执行。由于Node.js的模块机制,这些模块只会被加载一次。这意味着rouse.js
中的start
、upload
和rouse
函数也只会被定义一次。
解决方案
如果你希望某些功能可以重复执行,可以考虑将这些功能封装在一个循环或者事件监听器中。例如,在server.js
中添加一个循环来处理请求:
function server(rouse, head) {
function ser(req, res) {
var urls = url.parse(req.url).pathname;
var aa = rouse(urls, head);
res.write(aa);
res.end();
}
http.createServer(ser).listen('3000', () => {
console.log('Server is running on port 3000');
});
// 如果你希望在每次请求后重新加载模块
process.on('SIGINT', () => {
process.exit();
});
}
exports.server = server;
这样,服务器会在端口3000上持续监听请求,而不会因为多次运行index.js
而停止服务。
总结
Node.js的模块机制使得每个模块只会被加载一次,这可能会导致一些误解。通过理解模块的加载机制,你可以更好地设计你的应用程序,并确保某些功能能够正确地重复执行。
根据你的描述和代码,问题可能出在Node.js的模块缓存机制上。当一个模块被加载时,它会被缓存起来,以便后续的引用直接从缓存中获取,而不是重新执行模块中的代码。这意味着,如果你多次运行index.js
,server.js
和rouse.js
中的初始化逻辑(如全局变量定义、数据库连接等)不会再次执行。
示例代码解释
-
index.js
var http = require('./server'); var rouser = require('./rouse'); var head = {}; head['/'] = rouser.start; head['/start'] = rouser.start; head['/upload'] = rouser.upload; http.server(rouser.rouse, head);
-
server.js
var http = require('http'); var url = require('url'); function server(rouse, head) { function ser(req, res) { var urls = url.parse(req.url).pathname; var aa = rouse(urls, head); res.write(aa); res.end(); } http.createServer(ser).listen(3000); } exports.server = server;
-
rouse.js
function rouse(urls, head) { return head[urls]; } function upload() { return "Hello upload"; } function start() { return "Hello Start"; } exports.rouse = rouse; exports.start = start; exports.upload = upload;
为什么只执行一次
当你运行index.js
时,server.js
和rouse.js
会被加载并缓存。因此,无论你运行多少次index.js
,这些模块中的代码只会被执行一次。如果你希望某些初始化逻辑在每次运行index.js
时都执行,可以考虑将这部分逻辑放在index.js
中。
解决方案
如果你需要每次都重新执行某些代码,可以在index.js
中进行这些操作,而不是依赖于模块的缓存机制。例如:
// index.js
require('./server'); // 强制重新加载 server.js
require('./rouse'); // 强制重新加载 rouse.js
var http = require('./server');
var rouser = require('./rouse');
var head = {};
head['/'] = rouser.start;
head['/start'] = rouser.start;
head['/upload'] = rouser.upload;
http.server(rouser.rouse, head);
这样,每次运行index.js
时,server.js
和rouse.js
都会被重新加载和执行。