Мое приложение-узел использует экспресс-фреймворк.Я разработал промежуточное программное обеспечение для проверки параметров, но когда промежуточное программное обеспечение отправляет ошибку, оно не отправляется обратно в ответ.У меня есть эта проблема только на nodeter, на localhost она работает как положено.
Вот пример действия контроллера:
/*
* 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'
на локальном хосте, я получаю:
{"error": "error error", "message": "Параметр (-ы) отсутствует: ник, электронная почта, пароль "}
на NODESTER Я получил только:
Internal Server Error
({" error ":" ошибка запроса "," message ":" Отсутствуют параметры: ник, электронная почта, пароль "} появляется в журнале приложения, но не в ответе)
Есть идеи, что может быть не так?
ОБНОВЛЕНИЕ
Я нашел обходной путь, выполнив следующее в промежуточном программном обеспечении, когда предполагается выдать ошибку:
res.writeHead(200, {'content-type': 'application/json'});
res.write("my error message");
res.end();
вместо
next("my error message);
это работает таким образом, даже если яне уверен на 100%, что это лучшее решение.