如何在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
。 即外部create
function。
[ 进一步编辑 ]:
一个标准的设置将是这样的:
// 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函数。