我的节点应用使用快速框架。我开发了一个中间件来检查参数,但是当中间件发送错误时,它不会在响应中发回。 我在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'
在localhost上我得到:
{“error”:“查询错误”,“消息”:“参数缺失:昵称,电子邮件,密码”}
在NODESTER上我只得到了:Internal Server Error
({“error”:“查询错误”,“消息”:“参数缺失:昵称,电子邮件,密码”}出现在应用程序日志中但不出现在响应中)
知道可能出现什么问题吗?
更新
我发现了一个解决方法,在应该抛出错误的时候在中间件中发出以下内容:
res.writeHead(200, {'content-type': 'application/json'});
res.write("my error message");
res.end();
而不是
next("my error message);
即使我不是100%确定这是最好的解决方案,它也会以这种方式工作。
答案 0 :(得分:3)
看看你的快递configuration settings。
默认情况下,在“开发”下,服务器返回错误详细信息,而在“部署”下,它会隐藏它们。
<强>更新强>
关于您提出的解决方案。我建议您使用多个非标准参数调用next。
next("error", data)
然后在连接中创建一个全局中间件,它充当全局错误处理机制,您可以以个人的方式将错误数据写入响应。
您可能会遇到中间件行为异常的边缘情况。您必须详细了解next
的工作原理。