>我需要从我的快速应用程序发送 JSON 格式的自定义错误消息,使用无服务器 http 在 lambda 函数中提供
如果我弄错了,请纠正我,但据我了解,我们需要使用 LAMBA_PROXY APIG 集成才能发送直接从 lambda 函数定义的自定义错误消息。
这是我到目前为止尝试过的:
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>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Error</title>
</head>
<body>
<pre>Bad Request</pre>
</body>
</html>
关于如何以 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);
(我刚刚在这里回答了一个非常相似的问题)
是的,这在错误处理下的快速文档中进行了说明。
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);