node.js - AWS-serverless-express 从不使用 promise 解决

标签 node.js amazon-web-services express promise aws-lambda

任何人都可以阐明我在 github 上的 aws-serverless-express 存储库中打开的问题吗? https://github.com/awslabs/aws-serverless-express/issues/276

我正在尝试使用 aws-serverless-express 包运行我以前的 express.js 服务器。当我在没有任何特殊选项的情况下运行时,我解决了,但链中的 promise 永远不会得到尊重,这意味着我不会在事件循环中执行所有事情。

如果我使用 'PROMISE' 标志运行 serverlessexpress,我会执行我所有的 promise ,但程序永远不会解析并在设置的最长时间后超时。

我什至按照该 repo 中的示例开始了一个新项目,结果相同。

解决但不遵守我的 promise 时我的主要执行文件(index.js)

const awsServerlessExpress = require('aws-serverless-express')
const app = require('./app.js')
const server = awsServerlessExpress.createServer(app, null)

exports.handler = (event, context) => {
  return awsServerlessExpress.proxy(server, event, context)
}

我的主要执行文件 (index.js) 未解析时,但尊重我的 promise
const awsServerlessExpress = require('aws-serverless-express')
const app = require('./app.js')
const server = awsServerlessExpress.createServer(app, null)

exports.handler = (event, context) => {
  return awsServerlessExpress.proxy(server, event, context, 'PROMISE')
}

我也试过这个:
const awsServerlessExpress = require('aws-serverless-express')
const app = require('./app.js')
const server = awsServerlessExpress.createServer(app, null)

exports.handler = (event, context) => {
  return awsServerlessExpress.proxy(server, event, context, 'PROMISE').promise
}

我的快速服务器文件 (app.js)
const express = require('express')
const bodyParser = require('body-parser')
const awsServerlessExpressMiddleware = require('aws-serverless-express/middleware')
const app = express()
const router = express.Router()

router.use(bodyParser.json())
router.use(bodyParser.urlencoded({ extended: true }))
router.use(awsServerlessExpressMiddleware.eventContext())

router.get('/', (req, res) => {
  res.render('index', {
    apiUrl: req.apiGateway ? `https://${req.apiGateway.event.headers.Host}/${req.apiGateway.event.requestContext.stage}` : 'http://localhost:3000'
  })
})

router.get('/users', (req, res) => {
  res.json(users)
})

const users = [{
  id: 1,
  name: 'Joe'
}, {
  id: 2,
  name: 'Jane'
}]

function myFunc () {
  console.log('hey')
}
setTimeout(myFunc, 3000)

app.use('/', router)

module.exports = app

最佳答案

确保您正在设置 context.callbackWaitsForEmptyEventLoop假的

enter image description here

enter image description here
在这里阅读更多相关信息 https://docs.aws.amazon.com/lambda/latest/dg/nodejs-context.html

关于node.js - AWS-serverless-express 从不使用 promise 解决,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60746529/

相关文章:

用于快速路由器 url 的正则表达式以匹配以/public/开头的路径

python - pip使用什么端口?

hadoop - Amazon Elastic Map Reduce 是否在每个实例中运行一个或多个映射器进程?

php - 使用 php 为所有文件格式查找 Mime 类型的文件或 url

node.js - 防止 Express 向 Jade 模板显示错误

node.js - 在 Node 中使用 DynamoDB.DocumentClient 检索 StringSet 值

node.js - nodemon 在 package.json 中执行 "prestart"脚本

node.js - 使用带有 bunyan 的 stackdriver 日志记录时,即使在 gcp 的 vm 实例内部也会出现 PERMISSION_DENIED 错误

javascript - 使用 Express JS 和 Parse Cloud 托管的图像上传问题

javascript - Mocha 的 beforeEach() 和 did() 函数不起作用