如何将中间件放在Node.js / Express.js中自己的文件中

时间:2013-02-19 13:07:22

标签: node.js express middleware

我是整个Node.js的新手,所以我仍然试图了解事情如何“连接”。

我正在尝试使用express-form验证。根据你可以做的文件

app.post( '/user', // Route  
  form( // Form filter and validation middleware
    filter("username").trim()
  ),

  // Express request-handler gets filtered and validated data
  function(req, res){
    if (!req.form.isValid) {
      // Handle errors
      console.log(req.form.errors);

    } else {
      // Or, use filtered form data from the form object:
      console.log("Username:", req.form.username);

    }
  }
);

在App.js.但是,如果我放置app.get('/user', user.index);之类的内容,我可以将控制器代码放在一个单独的文件中。我想对验证中间件(或将验证代码放在控制器中)做同样的事情,以便在我开始添加更多页面后更容易概述App.js文件。

有没有办法实现这个目标?

基本上我想提出类似app.get('/user', validation.user, user.index);

的内容

2 个答案:

答案 0 :(得分:46)

这是您定义路线的方式:

<强> routes.js:

module.exports = function(app){
    app.get("route1", function(req,res){...})
    app.get("route2", function(req,res){...})
}

这是您定义中间件的方式:

<强> middlewares.js:

module.exports = {
    formHandler: function(req, res, next){...}
}

<强> app.js:

// Add your middlewares:
middlewares = require("middlewares");
app.use(middlewares.formHandler);
app.use(middlewares...);

// Initialize your routes:
require("routes")(app)

另一种方法是使用中间件每个路径

<强> routes.js:

middlewares = require("middlewares")
module.exports = function(app){
    app.get("route1", middlewares.formHandler, function(req,res){...})
    app.get("route2", function(req,res){...})
}

我希望我回答你的问题。

答案 1 :(得分:3)

您可以使用与控制器功能完全相同的方式将中间件功能放入单独的模块中。它只是一个带有适当参数集的导出函数。

因此,如果您有validation.js个文件,则可以将user验证方法添加为:

exports.user = function (req, res, next) {
  ... // validate req and call next when done
};