Как мне вернуть статус 500 и прекратить выполнение скрипта для этого маршрута - PullRequest
0 голосов
/ 14 июля 2020

Если в пользовательской функции возникает ошибка, я хотел бы остановить выполнение сценария и вернуть ответ с ошибкой 500.

Однако мой сценарий запускает ошибку, а затем продолжает сценарий.

. / Helpers. js

const requiredEnv = (vars, callback) => {
  const unsetEnv = vars.filter((varName) => !(typeof process.env[varName] !== 'undefined'));
  let error;
  if (unsetEnv.length > 0) {
    error = "Required ENV variables are not set: [" + unsetEnv.join(', ') + "]";
  }
  callback(error);
}

module.exports = { requiredEnv };

. / Route. js

const express = require('express');
const router = express.Router();
const requiredEnv = require('./requiredEnv');

router.post('/', (req, res) => {
  requiredEnv(['MY_VAR'], (error) => {
    console.log('this is an error shown in the console');
    res.status(500).send({ error });
    // should stop this script here...
  });

  // somehow it continues here, even though the previous callback function is returning an error
  console.log('this is continued');

  res.status(200).send({ message: 'Message sent' });

});
module.exports = router;

Я пробовал next(), но это не сработало.

обновление

У меня почти все заработало. (спасибо @oooyaya & @ ayu sh)

const middlewareFoo = function(_, res, next) {
  requiredEnv(['MY_VAR'], function (error) {
    if (error) {
      // ✓ it stops when MY_VAR is not present
      return res.status(500).send({ error });
    } else {
      // ✗ when MY_VAR is defined, it does not continue...
      console.log('continue if no error...');
      next()
    }
  });
}

router.use(middlewareFoo);

router.post('/', (req, res) => {
// ... left out for brevity

Но если ошибок нет, он не работает. Похожая проблема, наверное.

1 Ответ

1 голос
/ 14 июля 2020

Не проверено, но это, скорее всего, приблизит вас. Проблема в том, что вы используете асинхронный код, и поэтому res.send(200) происходит до обратного вызова для обратного вызова requiredEnv(). Они должны жить в рамках одного обратного вызова, и вы можете проверить, была ли ошибка или нет. Если да, то res.status(500). Если нет, res.status(200).

const express = require('express');
const router = express.Router();

router.post('/', (req, res, next) => {
  requiredEnv(['MY_VAR'], (error) => {
    if(error) {
        console.log('this is an error shown in the console');
        res.status(500).send({ error });
        // should stop this script here...
        return;
    }

    console.log('this is continued');
  
    res.status(200).send({ message: 'Message sent' });
  });


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