使用无服务器http(express)发送自定义错误消息

使用无服务器http(express)发送自定义错误消息,express,lambda,aws-api-gateway,serverless-framework,serverless,Express,Lambda,Aws Api Gateway,Serverless Framework,Serverless,我需要从我的express应用程序发送JSON格式的自定义错误消息,并使用 如果我弄错了,请纠正我,但据我所知,我们需要使用LAMBA_PROXY APIG集成,以便能够发送直接从lambda函数定义的自定义错误消息 这就是我迄今为止所尝试的: res.status(400).json({message:'email ready take'}); serverless.yml functions: auth: handler: src/express/auth/index.hand

我需要从我的express应用程序发送JSON格式的自定义错误消息,并使用

如果我弄错了,请纠正我,但据我所知,我们需要使用LAMBA_PROXY APIG集成,以便能够发送直接从lambda函数定义的自定义错误消息

这就是我迄今为止所尝试的:

res.status(400).json({message:'email ready take'});
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)


错误
(我刚才回答了一个非常类似的问题)

是的,这在下面的Express docs中进行了解释

Express附带一个内置的错误处理程序,用于处理应用程序中可能遇到的任何错误。此默认错误处理中间件函数添加在中间件函数堆栈的末尾

如果您将错误传递给
next()
,而您没有在自定义错误处理程序中处理它,那么它将由内置的错误处理程序处理;错误将与堆栈跟踪一起写入客户端。生产环境中不包括堆栈跟踪

要覆盖此处理程序,请参阅Express docs中标题为的部分

它解释说:

以与其他中间件函数相同的方式定义错误处理中间件函数,除了错误处理函数有四个参数而不是三个:
(err,req,res,next)
。例如:

最后,在other
app.use()之后定义错误处理中间件,并路由调用

因此,在您的例子中,如果您想用400和一些JSON来响应,您可以编写如下内容:

const serverless=require('serverless-http');
const express=require('express');
常量app=express();
//您的中间件和其他路由在这里
使用(/*将您的中间件注册为普通*/);
//最后,您的自定义错误处理程序
应用程序使用(函数customErrorHandler(err、req、res、next){
res.status(400).json({message:'email ready take'});
});
module.exports.handler=serverless(应用程序);

Hey@romellem,谢谢您的回答!很抱歉没有发布更多细节,但我已经这样实现了。所以我有'ApiRouter.post('/register',Controller.register);应用程序使用(
/auth
,ApiRouter);/*错误处理*/app.use(ErrorController.error404);应用程序使用(ErrorController.generalError);`我刚刚发现它没有到达最后一个错误处理程序。我会更新问题我已经更新了问题。您可以检查最低部分的更新,听起来好像Lambda正在覆盖Express的某些默认功能。你得做些矿石研究。我发现了这个问题--这可能会给你更多的线索。是的!lambda有点可疑,回退中间件没有被调用。也许在包装上,或者别的什么。我尝试了NODE_ENV=生产和开发,得到了相同的结果。现在我想直接从
catch
块调用错误中间件!
app.use(function (err, req, res, next) {
  console.error(err.stack)
  res.status(500).send('Something broke!')
})