微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在node.js应用程序中创建自己的功能模块

如何解决如何在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 举报,一经查实,本站将立刻删除。