如何在node.js应用程序中创build我自己的函数模块

我正在构build我的node.js应用程序,它具有以下结构:

  • server.js
  • 控制器/ user.js的

server.js需要user.js控制器:

require('./controllers/user.js').route(app, mongoose); 

controller / user.js文件就像:

 function route(app, mongoose){ function route(app, mongoose){ // Create new User item app.post('/user/create', function(req, res){ ... } // Edit user app.put('/user/:id/edit', function(req, res){ ... } ... } module.exports.route = route; 

这工作正常。 我知道在编辑用户函数中需要中间件,例如:

 ... app.put('/user/:id/edit', loadUser, function(req, res){ ... 

如果我在这一行上面定义loadUser函数,它工作正常。 当我将所有的中间件function添加到文件“./lib/middleware.js”中,并且当我尝试在user.js中加载该文件时:

 require('../lib/middleware.js').create(); // Create is the exported function 

这不起作用,我有错误消息说loadUser是一个未知的函数。

任何想法 ?

**更新**

我已经更新了这样的文件,在server.js(主文件)我有:

 ... var middleware = require('./lib/middleware.js'); ... require('./controllers/user.js').route(app, mongoose, middleware); ... 

在middleware.js中,我有:

 function create() { function loadUser(req, res, next) { // You would fetch your user from the db var user = users[req.params.id]; if (user) { req.user = user; next(); } else { next(new Error('Failed to load user ' + req.params.id)); } } return module; } 

在控制器/ user.js我有

 function route(app, mongoose, middleware){ ... // Modify an user app.put('/user/edit', middleware.loadUser, function(req, res){ ... } ... } 

当我运行应用程序(节点server.js),然后有以下错误:

 Error: PUT route /user/edit requires a callback 

我不确定在middleware.js中返回正确的东西,还不是很熟悉模块的东西。 我也尝试了“module.exports.create = create;” 但同样的事情。

更新与另一个尝试

如果我为该function创build一个模块呢? 在./lib/middleware.js我会有:

 (function(){ var middleware = {}; middleware.loadUser = function () { console.log("loadUser"); } return middleware; }()); 

在服务器中,我称之为:

 var middleware = require('./lib/middleware.js'); middleware.loadUser; 

在我看来,应该工作,但它不…

文件中的“全局”范围实际上是模块范围。 只要在不同的文件中创build一个函数,它就会成为原始文件的范围。

你想要做什么,而不是

 // routes.js var middleware = require("../lib/middleware.js").create(); app.put('/user/:id/edit', middelware["loadUser"], function(req, res){ 

你会发现全局variables实际写入module的范围。

那么你的function loadUser() { ... }应该存在于module属性中。

 // middleware.js function create() { ... return module; } 

如果你从创build函数返回module ,则返回全局范围。

[ 编辑 ]

 function create() { function loadUser(req, res, next) { // You would fetch your user from the db var user = users[req.params.id]; if (user) { req.user = user; next(); } else { next(new Error('Failed to load user ' + req.params.id)); } } return module; } 

您可能需要添加module.loadUser = loadUser或在模块范围内定义loadUser 。 即外部createfunction。

[ 进一步编辑 ]:

一个标准的设置将是这样的:

 // middleware.js (function() { function loadUser(...) { ... } ... module.exports.loadUser = loadUser; })(); //otherfile.js var middle = require("middleware"); middle.loadUser(); 

当使用require()加载代码时,它不会将任何内容放入全局上下文中。 你必须把它绑定到一个variables。

例如,当您需要中间件文件时,只能调用create(),因为module.exports对象是从require()函数返回的,您可以直接访问该调用站点。 下面是你将如何保持对require()d代码的引用,以便以后可以访问它:

 var middleware = require('../lib/middleware.js'); middleware.create(); 

可能这就是你想要的:

 app.put('/user/:id/edit', middleware.loadUser, function(req, res) ... 

更新:正如raynos指出的,在这种情况下,没有build议函数包装。 看到他的评论。

请注意,我用匿名函数包装了loadUser函数引用。 只要你的代码在内部不依赖于'this'的值,那么离开代码就可以工作。

更新:我想我误解了你用create()做的事情。 如果将loadUser()函数直接定义为模块的一部分,则上述工作方式是可行的。 如果你需要在你的Create()函数中做一些其他的事情,你可以用类似的方法来使用我之前写的东西

 var loadUser = middleware.create(); 

然后你将在范围中定义loadUser函数。