为什么这几个文件在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 运行第一次正常 在运行一次就无法找到了 求高手告知怎么回事 小弟在此谢过


2 回复

要理解为什么这几个文件在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.jsrouse.js会被加载并执行。由于Node.js的模块机制,这些模块只会被加载一次。这意味着rouse.js中的startuploadrouse函数也只会被定义一次。

解决方案

如果你希望某些功能可以重复执行,可以考虑将这些功能封装在一个循环或者事件监听器中。例如,在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.jsserver.jsrouse.js中的初始化逻辑(如全局变量定义、数据库连接等)不会再次执行。

示例代码解释

  1. 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);
    
  2. 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;
    
  3. 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.jsrouse.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.jsrouse.js都会被重新加载和执行。

回到顶部