Промежуточное ПО вызывается для обработки ошибок, но не для обработки ответа - PullRequest
0 голосов
/ 09 мая 2019

Я пытаюсь обработать ошибки, возвращая json, но мой обработчик ошибок (при вызове регистрируется в консоли) не вернет то, что я пытаюсь вернуть. Вот обработчик:

const handleError = function(err, req, res, next) {
    console.log(err);
    res.setHeader('Content-Type', 'application/json');
    res.status(500);
    res.send(JSON.stringify(error));
}

Но мне возвращают функцию рендеринга, которая переводится в следующее, возвращаемое мне как пользователю:

<code><!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <title>Error</title>
    </head>
    <body>
        <pre>Invalid token with reason JsonWebTokenError: jwt malformed

Таким образом, он по-прежнему будет регистрировать ошибку, но если я не верну ошибку в моей фактической функции, она не вернется, как задумано, иначе следующая функция возвращает ошибку json, как написано:

const view = function(req,  res, model, settings = {}, callback)  {
    let { params } = req;
    let { _id } = params;
    let { select, limit, sort } = settings;
    let query = model.findById(_id);
    if (select) query.select(select);
    if (sort) query.sort(sort);
    if (limit) query.limit(limit);
    query.exec(function(err, data) {
        if(callback) {
            callback(err,data);
        }else{
            if (err) return res.status(400).json({ 'Error': err.message });
            if (!data) return res.status(404).json({ 'Error': `No document with id ${_id} found` });
            return res.status(200).json(data);
        }
    });
}

Вот как я регистрирую свое промежуточное ПО

let app = express();
app.server = http.createServer(app);

// logger
app.use(morgan('dev'));

// 3rd party middleware
app.use(cors({
    exposedHeaders: config.corsHeaders
}));

// Custom error handling 
app.use(api.handleError);

//Set body as json as recieved
app.use(bodyParser.json({
    limit : config.bodyLimit
}));

Ответы [ 2 ]

0 голосов
/ 09 мая 2019

Попробуйте добавить промежуточное ПО обработчика ошибок ниже вашего маршрута. Пример:

app.get('/', indexHandler)
//call next(err) in indexHandler if there is an error
app.use(errorHandler)
0 голосов
/ 09 мая 2019

Когда я читаю экспресс-документацию по обработке ошибок, мне кажется, что вы предполагали до throw new Error() (или звоните next(), в зависимости от синхронизации /асинхронная природа ваших обработчиков), чтобы обработчик ошибок работал.

В вашем коде выше, я вижу вас return res.status().json() - что я не думаю, что это то же самое.

Вы указали, что unless I return an error in my actual function, it won't return as intended - так звучиткак вы уже знаете, что происходит.

Вы также упомянули, что handleError должен возвращать JSON - почему бы не изменить это:

res.status(500);
res.send(JSON.stringify(error));

... на ...

res.status(500).json(error)

Это должно дать вам то, что вам нужно.

...