Отправить пользовательское сообщение об ошибке, с serverless-http (express) - PullRequest
1 голос
/ 03 июня 2019

Мне нужно отправить пользовательское сообщение об ошибке в формате JSON из моего экспресс-приложения, обслуживаемое лямбда-функцией, используя serverless-http

Пожалуйста, исправьте меня, если я ошибся, нонасколько я понимаю, нам нужно использовать интеграцию LAMBA_PROXY APIG, чтобы иметь возможность отправлять пользовательские сообщения об ошибках, определенные непосредственно из лямбда-функции.

Это то, что я пробовал до сих пор:

res.status(400).json({ message: 'email already taken' });

serverless.yml

functions:
  auth:
    handler: src/express/auth/index.handler
    name: ${self:service}-auth-${env:STAGE}
    # warmup: true
    integration: lambda-proxy
    memorySize: 128
    timeout: 15
    events:
        - http:
            path: /auth/
            method: ANY
            cors: true
        - http:
            path: /auth/{any+}
            method: ANY
            cors: true

это то, что API возвращает (с кодом состояния 400)

<!DOCTYPE html>

    
        
        Error
    
    
        Bad Request

Есть ли какие-либо сведения о том, как я могу отправить собственный ответ в формате JSON?

обновление: после дополнительных тестов я обнаружилчто вызов next(error) не достигает последнего обработчика ошибок


const register = async (req, res, next) {
  try {
    await verifyEmail(req.body.email);
    const user = await Users.register(req.body);
    const token = sign(user.attrs, {});
    res.json({ token, user });
  } catch (e) {
    next(e);
  }
};

const generalError = async (err, req, res, next) => {
  // doesn't reach this part! :(
  console.log('generalError handler', JSON.stringify(err));
  res.status(errorOut.status).json(errorOut);
};

ApiRouter.post('/register', register);
app.use('/auth', ApiRouter);
app.use(generalError);

1 Ответ

2 голосов
/ 03 июня 2019

(я только что ответил на очень похожий вопрос здесь )

Да, это объясняется в документах Express в разделе Обработка ошибок .

Express поставляется со встроенным обработчиком ошибок, который заботится о любых ошибках, которые могут возникнуть в приложении. Эта промежуточная функция обработки ошибок по умолчанию добавляется в конец стека функций промежуточного программного обеспечения.

Если вы передаете ошибку в next() и не обрабатываете ее в пользовательском обработчике ошибок, она будет обрабатываться встроенным обработчиком ошибок; ошибка будет записана клиенту с трассировкой стека. Трассировка стека не включена в производственную среду.

Чтобы переопределить этот обработчик, обратитесь к разделу в документах Express под названием Запись обработчиков ошибок .

Это объясняет:

Определяют функции промежуточного программного обеспечения для обработки ошибок так же, как и другие функции промежуточного программного обеспечения, за исключением того, что функции для обработки ошибок имеют четыре аргумента вместо трех: (err, req, res, next). Например:

app.use(function (err, req, res, next) {
  console.error(err.stack)
  res.status(500).send('Something broke!')
})

Вы определяете промежуточное ПО для обработки ошибок последним, после других app.use() и маршрутизируете вызовы

Так что в вашем случае, если вы хотите ответить 400 и JSON, вы можете написать что-то вроде этого:

const serverless = require('serverless-http');
const express = require('express');
const app = express();

// Your middleware and other routes here
app.use(/* register your middleware as normal */);

// Finally, your custom error handler
app.use(function customErrorHandler(err, req, res, next) {
   res.status(400).json({ message: 'email already taken' });
});

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