node.js的express中间件不会在nodester上返回错误

时间:2011-05-01 08:38:51

标签: node.js express

我的节点应用使用快速框架。我开发了一个中间件来检查参数,但是当中间件发送错误时,它不会在响应中发回。 我在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%确定这是最好的解决方案,它也会以这种方式工作。

1 个答案:

答案 0 :(得分:3)

看看你的快递configuration settings

默认情况下,在“开发”下,服务器返回错误详细信息,而在“部署”下,它会隐藏它们。

<强>更新

关于您提出的解决方案。我建议您使用多个非标准参数调用next。

next("error", data)

然后在连接中创建一个全局中间件,它充当全局错误处理机制,您可以以个人的方式将错误数据写入响应。

您可能会遇到中间件行为异常的边缘情况。您必须详细了解next的工作原理。