我的節點應用程序使用快速框架。我開發了一箇中間件來檢查參數,但是當中間件發送錯誤時,它不會在響應中發回。 我只在節點上有這個問題,在本地主機上按預期工作。node.js的高速中間件不會在節點上返回錯誤
這裏是控制器動作的一個例子:
/*
* Create a new user
*
*/
app.post('/user/create', md.checkParams(["nickname", "email", "password"]), function(req, res){
var email = req.query.email;
var nickname = req.query.nickname;
var password = req.query.password;
jsonObj = { "nickname" : nickname, "email" : email, "password" : password };
// Save user in DB
db.hmset("user:" +nickname, jsonObj, function(err1){
if(!err1) {
db.sadd("users","user:" + nickname, function(err2){
if(err2){
jsonObj = {"error" : "database error", "message" : "error adding object to set" };
}
h.respond(res, jsonObj);
});
} else {
jsonObj = {"error" : "database error", "message" : "error creating hash for object" };
h.respond(res, jsonObj);
}
});
});
的checkParams中間件是:
function checkParams(arr){
return function(req, res, next) {
// Make sure each param listed in arr is present in req.query
var missing_params = [];
for(var i=0;i<arr.length;i++){
if(! eval("req.query." + arr[i])){
missing_params.push(arr[i]);
}
}
if(missing_params.length == 0){
next();
} else {
next(JSON.stringify({ "error" : "query error", "message" : "Parameter(s) missing: " + missing_params.join(",") }));
}
}
}
舉例來說,如果我在本地主機上使用
curl -XPOST 'http://HOST/users/create'
我得到:
{ 「錯誤」: 「查詢錯誤」, 「消息」: 「參數(一個或多個)丟失:暱稱,電子郵件,密碼」}
上NODESTER我只得到:
Internal Server Error
({「錯誤「:」查詢錯誤」,‘消息’:‘參數(一個或多個)丟失:暱稱,電子郵件,密碼’}出現在應用程序日誌,但並未出現在迴應)
任何想法可能是錯誤的?
UPDATE
我找到了一個解決方法通過發出中間件以下時,是應該的錯誤被拋出:中
res.writeHead(200, {'content-type': 'application/json'});
res.write("my error message");
res.end();
代替
next("my error message);
它的工作本即使我不是100%確定這是最好的解決方案。
唯一的「更好」的解決方法是調用'下一個(「錯誤」,細節)'和添加自己的錯誤處理中間件寫細節的響應。讓它與其他中間件很好地搭配可能會很棘手。我認爲直接寫回應給你最大的控制力,並且消除邊緣情況。 – Raynos 2011-05-01 16:11:30
@Raynos你是對的,那是好東西。你能改變你的評論作爲答案嗎? – Luc 2011-05-01 17:30:59