我正在構建一個快速應用程序,我想知道我可以用中間件獲得多大的功能。粗略地說,我想用中間件來完成以下任務。Node.js中間件組織和參數驗證
完成:
- 添加的requestId所有路線
- 身份驗證請求的用戶
- 檢查是否有(從 認證分開)訪問給定的資源
未完成:
- A)對於給定的路由驗證參數
- B)組織中間件在一個健全的方式,如果它從路線路線不同, 和3中間件例行稱爲每條路線
我已經定義我中間件在一個單獨的文件,將其導入到app.js像這樣:
var middleware = require('./middleware');
var requestId = middleware.requestId;
var authenticate = middleware.authenticate;
將它應用到我添加它來表達配置的所有路由:
var app = express.createServer();
app.configure(function() {
app.use(express.logger());
app.use(express.cookieParser());
app.use(express.bodyParser());
app.use(requestId); // add requestId to all incoming requests
});
而對於路線細節,我將其添加爲app.get參數:
var routes = require('./v1/routes');
app.get("/v1/foo", routes.foo);
app.get("/v1/bar", authenticate, routes.bar);
問題的
我很想有中間件,我可以用它來檢查參數
validate('x','y','z')
並使用它像這樣對於給定的路線:
app.get("/v1/bar", authenticate, validate('x','y','z'), routes.bar);
有沒有一個很好的方法來做到這一點?或者我應該在路由定義文件中按照每個路由進行驗證?
題B
有沒有更好的方式來組織和使用我的中間件,我應該考慮什麼?
更新
我正在尋找一種方法來驗證更改路線之間的很多參數。下面顯然不起作用 - 我不能將params傳遞到中間件 - 但是有沒有辦法在那裏定義中間件來執行此操作,並按照上面所述的方式調用它?
var validateParams = function (req, res, params, callback) {
// Make sure the required parameters are in the request
console.log('checking for params '+params);
for (var i = 0; i < params.length; i++) {
var param = params[i];
if(!(param in req.query)){
logger.info('cannot find param ['+param+'] in req: '+JSON.stringify(req.query));
res.writeHead(400, {
"Content-Type": "application/json"
});
var out = {
"err": "request missing required parameters"
};
res.end(JSON.stringify(out));
return;
}
}
callback();
}
您會希望將req,res傳遞給您的中間件,以驗證(req,res),然後從那裏執行操作。通常這比傳遞預定變量更簡單。 – Brandon
嘗試查找express-validator。我沒有用它在中間件,但它看起來有可能:https://github.com/ctavan/express-validator – chovy