请求正文未从 aws-serverless-express 模块进入 app.js 文件
Posted
技术标签:
【中文标题】请求正文未从 aws-serverless-express 模块进入 app.js 文件【英文标题】:Request body not coming to app.js file from the aws-serverless-express module 【发布时间】:2018-01-09 06:42:45 【问题描述】:app.js 文件代码:
app.post('/update/name', function(req, res)
console.log('Request came : ', req) // I printed the whole request no body came
lambda.js(这是处理函数)
'use strict'
const awsServerlessExpress = require('aws-serverless-express')
const app = require('./app')
const binaryMimeTypes = [
'application/javascript',
'application/json',
'application/octet-stream',
'application/xml',
'font/eot',
'font/opentype',
'font/otf',
'image/jpeg',
'image/png',
'image/svg+xml',
'text/comma-separated-values',
'text/css',
'text/html',
'text/javascript',
'text/plain',
'text/text',
'text/xml'
]
const server = awsServerlessExpress.createServer(app, null,
binaryMimeTypes)
exports.handler = (event, context) =>
console.log('body came from api gateway', event.body) // here we can see the body in cloudwatch logs
awsServerlessExpress.proxy(server, event, context) // but when this method makes request to our app.js file where the request goes, no body comes there.
aws-serverless-express(内置节点模块)代码:
consider this link for the code :
https://github.com/awslabs/aws-serverless-express/blob/master/index.js
在 aws-serverless-code 中,我评论了这一行:https://github.com/awslabs/aws-serverless-express/blob/master/index.js#L36 然后我能够在我在 app.js 中阅读的 headers['x-apigateway-event'] 中获取正文,但这是不是正确的方式,因为我正在触摸模块并且当我在没有节点模块的情况下在 github 中提交代码时,如果我团队的其他成员将提取代码,那么他将再次无法获取正文。
【问题讨论】:
【参考方案1】:我遇到了同样的问题。我试图使用 aws-serverless-express 将我的快速应用程序端点作为 Lambda 函数调用。所有代码都很好,但是当我使用sam local invoke MyFunction -e event.json
调用该函数时,我会得到一个空的req.body
。最终,感谢https://github.com/awslabs/aws-serverless-express/issues/92,我意识到事件文件头丢失了Content-Type
,并且不接受application-json
。将两者都添加到headers
解决了这个问题。
"headers":
"Accept": "application/hal+json,text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
"Content-Type": "application/json;charset=UTF-8"
我曾使用sam local generate-event api
生成事件文件。
【讨论】:
【参考方案2】:我尝试了 AWS CodeStar 的 Web 服务模板,使用 Express.js 和 Lambda 并遇到了同样的问题。经过几个小时的谷歌搜索和阅读上述 github 线程。我刚刚做了以下事情:
安装正文解析器:
$ npm install body-parser --save
然后更新app.js
app.use(bodyParser.json());
app.use(bodyParser.urlencoded( extended: true ));
app.use(awsServerlessExpressMiddleware.eventContext());
应该这样做
【讨论】:
以上是关于请求正文未从 aws-serverless-express 模块进入 app.js 文件的主要内容,如果未能解决你的问题,请参考以下文章