2011-05-01 27 views
0

我的節點應用程序使用快速框架。我開發了一箇中間件來檢查參數,但是當中間件發送錯誤時,它不會在響應中發回。 我只在節點上有這個問題,在本地主機上按預期工作。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%確定這是最好的解決方案。

+0

唯一的「更好」的解決方法是調用'下一個(「錯誤」,細節)'和添加自己的錯誤處理中間件寫細節的響應。讓它與其他中間件很好地搭配可能會很棘手。我認爲直接寫回應給你最大的控制力,並且消除邊緣情況。 – Raynos 2011-05-01 16:11:30

+0

@Raynos你是對的,那是好東西。你能改變你的評論作爲答案嗎? – Luc 2011-05-01 17:30:59

回答

3

看看你的快遞configuration settings

默認情況下,「開發」服務器返回錯誤的細節,而在「部署」下它隱藏它們。

更新

至於你提出的解決方案。我建議你調用next多個非標準參數,即

next("error", data)

然後在連接全球中間件充當你寫錯誤數據的響應在自己個人的方式在全球的錯誤處理機制。

您可能會遇到一些中間件表現異常的邊緣情況。您需要詳細瞭解next的工作原理。

+0

@Raynos,嗯,我只使用「app = require('express')。createServer();」,沒有定義配置。乾杯,我會檢查這個方向。 – Luc 2011-05-01 09:34:08

+0

@Raynos,如果我使用「app.use(express.errorHandler());」,我設法在本地獲得「內部服務器錯誤」。仍然無法在生產中禁用它。 – Luc 2011-05-01 10:29:48

+0

@Luc不要使用任何errorHandler。刪除'app.use'行。如果你想要一個有用的錯誤信息,你可以使用'app.user(express.errorHandler({dumbExceptions:true}))' – Raynos 2011-05-01 10:31:27