Express / Node.JS Ошибка повышения промежуточного программного обеспечения, продолжает обработку - PullRequest
1 голос
/ 30 января 2012

Я начинаю с NodeJS / Express и сталкиваюсь со следующей проблемой (я, вероятно, еще не освоил все приемы асинхронного программирования)

Я сделал промежуточное ПО, отвечающее за проверкуесли переданы параметры oauth_token (фактически реализующий слой oAuth на моем сервере узлов)

Я делаю это:

function myMiddle(req,res,next) {
  var oAuthToken = req.query["oauth_token"];
  if (oAuthToken == undefined) {
            res.send(406);
            res.end();
    next(new Error('No token provided'));   
}
/* Basically doing some DB stuff with MongoDB, connecting and using oAuthToken provided to query, etc.. */

Дело в том, что я ожидал, что код "умрет", когдаон не получает параметры oauth_token в строке запроса.Это на самом деле вызывает у меня ошибку и возвращает ошибку 406 моему HTTP-клиенту, но код продолжает обрабатываться и выдает ошибки изменяемого заголовка, вызванные моим кодом обработки после, и мой сценарий умирает.

Что-то, чего мне не хватает?Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 30 января 2012

Если ваш oAuthToken не определен, Node.js отвечает.После этого вы запускаете next(...), который пытается сделать еще один ответ на тот же запрос.Это терпит неудачу, и вы видите то, что видите.Обратите внимание, что в Node.js использование res.send(); и res.end(); не останавливает вашу функцию.Так что вам нужно сделать следующее:

function myMiddle(req,res,next) {
  var oAuthToken = req.query["oauth_token"];
  if (oAuthToken == undefined) {
    next(new Error('No token provided')); // handle everything here

    // res.send(406);
    // res.end();
    // unnecessary, throws errors because you try to respond twice
  }
  // do something if this is fine
}

или сделать это иначе - использовать res.send(406); res.end(); без next(...).

1 голос
/ 20 декабря 2015

Это может быть поздно, но я только что столкнулся с этой проблемой.Фактически вы можете передать ошибку ErrorHandler, чтобы промежуточное ПО не переходило к следующему промежуточному ПО или маршрутизатору, пока вы можете отправить нужный код состояния HTTP.

Ваше промежуточное ПО

function myMiddle(req, res, next) {
  // Do validate your OAuth token
  // you might want to do better validation of the token here
  // instead of just checking its existence
  //
  // var oAuthToken = req.query['oauth_token'];
  //
  // According to JSLint, you can just directly select the object as:
  //
  // req.query.oauth_token

  if (req.query.oauth_token === undefined) {

    // Just let the ErrorHandler does the rest
    // like redirecting or just send message to client
    var err = new Error('Unauthorized access.');
    err.status(406); // Or 403, or any HTTP status code

    // Pass it to ErrorHandler
    next(err);

  } else {
    // Do something here, or just
    next();
  }
}

Ваш ErrorHandler

app.use(function(err, req, res, next){
  if (err.status == 406) {
    // You can just do res.sendStatus()
    res.sendStatus(406); // Set HTTP status code as 406 and send message to client

    // Or chaining res.status() with res.send()
    res.status(406).res.send(); // or res.render(), or res.json()

    return;

  }

  // Others
});

Подробнее об ErrorHandler: http://expressjs.com/ja/guide/error-handling.html

0 голосов
/ 30 января 2012

Есть ли у вас экспресс-обработка ошибок (app.use(express.errorHandler()) в вашем стеке промежуточного программного обеспечения?

Также см. Раздел промежуточное программное обеспечение для получения подробной информации о том, как использовать next().

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