如何用expressJS创build一个nodeJS模块

我正在做一个nodeJS模块,我想用expressJS作为它的框架。 我想看看,我怎么可以通过,其中包括一个函数和app.get(); 并通过另一个文件(如实际的应用程序)调用它。

var express = require("express"); var app = express(); app.get("/", function (req, res) { exports.type = function (text) { console.log(req.ip); console.log(text); } }); 

现在当我使用这个,我打电话给实际的应用程序,如:

 var web = require("directory_to_file"); var express = require("express"); var app = express(); var http = require("http").Server(app); app.get("/", function (req, res) { web.type("Hello, world"); }); http.listen(10022, function () { console.log("server is up"); }); 

我得到一个错误:

 TypeError: Property 'type' of object #<Object> is not a function 

任何人都知道一种方法,使我可以调用这个函数?

在您的directory_to_file您只能在app.get('/')上导出,这将永远不会被调用。

你可以在你的directory_to_file添加下面的代码

 var express = require('express'); var router = express.Router(); router.get('/', function(req, server) { console.log(req.ip); }); module.exports = router; 

在你的主文件中,你可以使用app.use('/', web)

一个简短的解释:你正在你的directory_to_file文件中创build一个不会被启动或使用的新的快速app / config。 所以你的app.get事件不会被触发一次。

这就是为什么web.type不是一个函数。 你没有出口任何东西。 使用我提供的方式。 这是一个常用的方法。

你可以调用我提供的“路由”的代码。 创build多个路线/路线文件,并将其包含在主要方法中。

你的代码看起来很混乱。 如果我正确地理解了你,你真正想要做什么(至less在Node / Express术语中)是编写你自己的中间件 。

快车的devise是考虑到这一点,它是非常简单的,例如

ipLogger.js

 module.exports = function(req, res, next) { console.log(req.ip); next(); } 

app.js

 var http = require("http") , express = require("express"); , app = express() , server = http.Server(app) , ipLogger = require("./ipLogger.js"); app.use(ipLogger()); // log IP of all requests // handle routes server.listen(10022, function() { console.log("server is up"); }); 

通常有两件事情要作为一个模块导出 – 一个API和一个中间件。 中间件的典型例子是authentication模块。 要做中间件,只需导出中间件。 我倾向于做更多一点,所以我可以稍后configuration中间件。 一些沿着这条线:

 module.exports = exports = function(config) { // Do something with config here return function(req, res, next) { // your middleware here }; }; 

然后你可以在你的主程序中使用你的中间件,如下所示:

 var app = require('express')(), mymodule = require('./mymodule'); var config = {}; // replace with whatever config you need app.use(mymodule(config)); app.listen(process.env.PORT || 3000); 

要实现一个API,你将创build一个Router对象,然后将你的路由附加到Router对象。 然后你可以在主程序中“挂载”你的路由器。 例如,你可以有一个名为“myroutes.js”的文件,内容如下:

 var express = require('express'), myroutes = express.Router(); myroutes.get('/foo', (req, res) => { res.status(200).type('application/json').send({ myparam: 'foo' }); }); module.exports = exports = myroutes; 

在你的主程序中有以下内容:

 var app = require('express')(), myroutes = require('./myroutes'); app.use('/api', require('./myroutes')); app.listen(process.env.PORT || 3000); 

在'myroutes.js'中,我定义了/ foo的子path,然后在主程序中,我将它挂载在/ api上,所以我将访问/ api / foo来访问该API。