触发警告:初学者问题。
我使用Express和Mongoose以及MongoDB Atlas DB构建了一个api。
在大多数情况下,它可以正常工作,但经常会出现超时错误。这似乎是随机发生的,涉及所有路线,等等。确切地说,我得到:
`502 Internal server error via POSTMAN`
在无服务器仪表板中,我得到:
invocation
time invoked 1 day ago, mar 08 at 1:38pm
fatal error Function execution duration going to exceeded configured timeout limit.
cold start
duration 48.9 s
memory used na
request
endpoint /{proxy+}
method POST
status 502
message Internal server error
latency 27 ms
并跨度和日志:
我使用本教程包装了我的express应用程序,以使用无服务器框架进行部署:https : //dev.to/adnanrahic/a-crash-course-on-serverless-apis-with-express-and-mongodb-193k
Serverless.yml文件:
service: serviceName
app: appName
org: orgName
provider:
name: aws
runtime: nodejs12.x
stage: ${env:NODE_ENV}
region: eu-central-1
environment:
NODE_ENV: ${env:NODE_ENV}
DB: ${env:DB}
functions:
app:
handler: server.run
events:
- http:
path: /
method: ANY
cors: true
- http:
path: /{proxy+}
method: ANY
cors: true
plugins:
- serverless-offline # Utiliser pour tester localement
- serverless-dotenv-plugin
server.js文件:
const sls = require('serverless-http')
const app = require('./app')
module.exports.run = sls(app)
app.js文件:
const express = require('express')
const cors = require('cors')
const bodyParser = require('body-parser')
const newRoutes = require('./routes/file')
const app = express()
app.use(bodyParser.json())
const helmet = require('helmet')
app.use(helmet())
app.options('*', cors())
app.use(cors({ allowedHeaders: 'Content-Type, Authorization' }))
app.use('/new-route', newRoutes)
app.use((error, req, res, next) => {
console.log(error)
const status = error.status || 500
const message = error.message
res.status(status).json({
status: status,
message: message
})
})
// Gère la connexion à la base de donnée :
require('./db')
module.exports = app
最后是db.js文件:
const mongoose = require('mongoose')
mongoose
.connect(
process.env.DB, {
useNewUrlParser: true,
useUnifiedTopology: true
})
.then(() => {
console.log('connected')
})
.catch(err => console.log(err))
据我了解,这与Lambda中的冷启动以及API网关处理超时(!?)的方式有关。我已经在猫鼬的文档(https://mongoosejs.com/docs/lambda.html)上阅读了此内容,还阅读了其他教程,但是我并不觉得应该多么适应我的情况。
感谢您的帮助
该问题可能是由于您打开的数据库连接引起的。建立此连接后,对的任何调用callback
都不会返回给客户端,并且您的函数将超时。
您需要设置context.callbackWaitsForEmptyEventLoop
为false
。
这是docs的解释:
callbackWaitsForEmptyEventLoop –设置为false可在回调执行时立即发送响应,而不是等待Node.js事件循环为空。如果为假,则所有未完成的事件在下一次调用期间将继续运行。
有了serverless-http
你可以设置这个选项,你的内很容易server.js
的文件:
const sls = require('serverless-http')
const app = require('./app')
module.exports.run = sls(app, { callbackWaitsForEmptyEventLoop: false })
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句