如何解决如何在node.js应用程序中创建自己的功能模块
|| 我正在构建具有以下结构的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\',res){
...
}
...
}
module.exports.route = route;
一切正常。
我知道例如想在“编辑用户”功能中使用中间件,因此它看起来像:
...
app.put(\'/user/:id/edit\',loadUser,res){
...
如果我在此行的正上方定义loadUser函数,则可以正常工作。当我将所有中间件功能添加到文件\'./ 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;
}
在controllers / user.js我有
function route(app,middleware){
...
// Modify an user
app.put(\'/user/edit\',middleware.loadUser,res){
...
}
...
}
当我运行应用程序(节点server.js)时,出现以下错误:
Error: PUT route /user/edit requires a callback
我不确定在Middleware.js中返回正确的内容,但还不太熟悉模块内容。我也尝试了\“ module.exports.create = create; \”,但还是一样。
尝试其他更新
如果我为该功能创建模块怎么办?在./lib/middleware.js中,我将拥有:
(function(){
var middleware = {};
middleware.loadUser = function () {
console.log(\"loadUser\");
}
return middleware;
}());
在服务器中,我称之为:
var middleware = require(\'./lib/middleware.js\');
middleware.loadUser;
在我看来,这应该可以,但不能...
解决方法
文件中的“全局”作用域实际上是模块作用域。仅通过在其他文件中创建函数,它就可以在原始文件中生效。
您要做的是
// routes.js
var middleware = require(\"../lib/middleware.js\").create();
app.put(\'/user/:id/edit\',middelware[\"loadUser\"],function(req,res){
您会发现全局变量实际上在其范围内写入module
。
然后,您的function loadUser() { ... }
应该存在于module
属性中。
// middleware.js
function create() {
...
return module;
}
如果从create函数返回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
功能之外。
[进一步编辑]:
标准设置如下所示:
// middleware.js
(function() {
function loadUser(...) {
...
}
...
module.exports.loadUser = loadUser;
})();
//otherfile.js
var middle = require(\"middleware\");
middle.loadUser();
,使用require()加载代码时,它不会在全局上下文中放入任何内容。您必须将其绑定到变量。
例如,当您需要中间件文件时,您只能调用create(),因为module.exports对象是从require()函数返回的,并且可以直接访问调用站点。这是您如何保留对require()d代码的引用,以便以后可以访问它:
var middleware = require(\'../lib/middleware.js\');
middleware.create();
可能这就是您想要的:
app.put(\'/user/:id/edit\',middleware.loadUser,res) ...
更新:
正如raynos所指出的,在这种情况下不建议使用函数包装器。见他的评论。
请注意,我将loadUser函数引用包装在一个匿名函数中。只要您的代码在内部不依赖于'this \'的值,就可以按原样保留代码。
更新:
我想我误解了您想使用create()做些什么。如果您直接将loadUser()函数定义为模块的一部分,则以上方法适用。如果您需要在Create()函数中做其他棘手的事情,则可以通过执行类似上面的操作来使用我上面写的内容
var loadUser = middleware.create();
然后,您将在scope中定义了loadUser函数。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。