2013-02-19 65 views
15

我是新來的整個Node.js的東西,所以我仍然試圖讓事情「連接」的竅門。如何把中間件放在它自己的Node.js/Express.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);

回答

33

這是你如何定義你的路由:

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){...}) 
} 

我希望我能回答你的問題。

+0

這是我之後的每條路線方法。感謝這個例子中的廣泛解釋 – danneth 2013-02-19 17:41:20

+2

,是否有一行代碼可以在app.js中應用所有middlewares.js? – 4m1r 2015-03-12 00:14:54

+0

只有在學習node.js幾天後才能解決這個問題,這個問題對我來說纔有意義。驚人。 – 2016-02-09 20:43:09

1

你可以把中間件功能集成到一個單獨的模塊中的完全相同的方式,你的控制器功能做。這只是一個具有適當參數集的導出函數。

所以,如果你有一個validation.js文件,你可以添加你的user驗證方法爲:

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

是啊「適當的參數集」就是這樣的技巧:)我還沒有完全掌握導出/需求關係呢 – danneth 2013-02-19 17:42:18

相關問題