如何为Node.js创建模块?

23

我有一段简单的代码:

var http = require("http");

var server = http.createServer(function(request, response) {
    response.writeHead(200, {"Content-Type" : "text/html"});
    response.write("Hello World");
    response.end();
});

server.listen(8000);

console.log("Server has started.");

我想将这段代码放入server.js中,它必须是一个具有多个内部功能的模块。我想要创建server模块并在其中创建listen()函数。

我应该在名为listen()的函数中放置createServer()

如果我有index.js,如何调用此模块并执行像server.listen()这样的操作?


2
问题有点混乱。你实际上在问什么? - Raynos
3个回答

58

在Node.js模块中常见的模式是创建一个文件(例如mymodule.js),以此来:

var myFunc = function() {
   ...
};

exports.myFunc = myFunc;

如果你将它存储在node_modules目录中,可以这样导入:

var mymodule = require('mymodule');

mymodule.myFunc(args...);

所以,在你的情况下,你的模块 server.js 可以像这样:

// server.js
var http = require("http");

var listen = function(port) {
    var server = http.createServer(function(request, response) {
        response.writeHead(200, {"Content-Type" : "text/html"});
        response.write("Hello World");
        response.end();
    });
    server.listen(port);
};

exports.listen = listen;

将被调用的内容:

// client.js
var server = require('server');
server.listen(8000);

所以在我的server.js文件中,我无法调用"server"变量......因为它是局部的(在listen函数内部.....对吗? - dail
@dail 没错,我很抱歉。如果你将其声明为模块级别的,将其放在函数外部,那么你只能创建一个服务器。不过,你的实用函数可以成为 listen 中的内部函数,在那里它们仍然可以访问该变量。 - Alnitak
3
可以将存储在磁盘上特定位置(如/home/username/Desktop)的模块导入,而不是从node_modules文件夹中导入吗? - Anderson Green

5

虽然这是一篇旧文,但如果有人仍然感兴趣,我建议采用以下解决方案:

//server.js

var http = require("http");

// As soon as method will be used outside the module, use "this":

this.listen = function(port) {
    var server = http.createServer(function(request, response) {
        response.writeHead(200, {"Content-Type": "text/html"});
        response.write("Hello World");
        response.end();
    });
    server.listen(port);
};


//index.js

var module = require('./server');
module.listen(8000);

3
// main.js
var server = require("server");

server.listen(8000);

console.log("Server has started.");


// server.js

var http = require("http");

var server = http.createServer(function(request, response) {
    response.writeHead(200, {
        "Content-Type": "text/html"
    });
    response.write("Hello World");
    response.end();
});

module.exports = server;

4
就我所知,我不认为仅仅“要求”一个模块会像这段代码一样产生副作用(比如实例化服务器)。 - Alnitak
@Alnitak 我猜这是一个不好的设计。虽然它实际上没有在服务器上监听,但在这个特定情况下是可以接受的灰色地带,但一般来说是不好的。 - Raynos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接