Экспресс промежуточное программное обеспечение node.js не возвращает ошибку на nodeter - PullRequest
0 голосов
/ 01 мая 2011

Мое приложение-узел использует экспресс-фреймворк.Я разработал промежуточное программное обеспечение для проверки параметров, но когда промежуточное программное обеспечение отправляет ошибку, оно не отправляется обратно в ответ.У меня есть эта проблема только на 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%, что это лучшее решение.

1 Ответ

3 голосов
/ 01 мая 2011

Посмотрите на ваши экспресс-настройки .

по умолчанию в разделе "разработка" сервер возвращает подробности об ошибках, тогда как в разделе "развертывание" он скрывает их.

Обновление

Что касается предложенного вами решения.Я бы порекомендовал вам вызвать далее с несколькими нестандартными параметрами, например

next("error", data)

, а затем иметь глобальное промежуточное ПО в соединении, которое действует как глобальный механизм обработки ошибок, в котором вы записываете данные об ошибках вответ по-своему.

У вас могут быть некоторые крайние случаи, когда промежуточные программы ведут себя странно.Вы должны изучить, как next работает в деталях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...