AWS -serverless- express никогда не разрешается с обещаниями - PullRequest
5 голосов
/ 18 марта 2020

Может кто-нибудь пролить свет на мою проблему, открытую в репозитории aws -serverless- express на github? https://github.com/awslabs/aws-serverless-express/issues/276

Я пытаюсь запустить свой предыдущий сервер express. js, используя пакет aws -serverless- express. При запуске без каких-либо специальных опций я разрешаю, но обещания в цепочке никогда не выполняются, то есть я не выполняю все действия в событии l oop.

Если я запускаю без сервера express с 'PROMISE 'Я выполняю все свои обещания, но программа никогда не разрешается и время ожидания истекает после установленного максимального времени.

Я даже начал новый проект в соответствии с примером в этом репо, тот же результат.

Мой основной исполняемый файл (индекс. 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)
}

Мой основной исполняемый файл (индекс. 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, '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
}

Файл моего express сервера (приложение. 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

Ответы [ 2 ]

2 голосов
/ 07 апреля 2020

Убедитесь, что вы устанавливаете context.callbackWaitsForEmptyEventLoop в false

enter image description here

enter image description here Подробнее об этом здесь https://docs.aws.amazon.com/lambda/latest/dg/nodejs-context.html

0 голосов
/ 14 апреля 2020

Проблема касалась моего инструмента тестирования:

https://www.npmjs.com/package/run-local-lambda

Когда я говорил с поддержкой AWS, мне сказали использовать:

sam local invoke "Test" -e event.json

С файлом событий. json, который включает в себя следующее:

{
    "httpMethod": "OPTIONS",
    "//body": "{\"name\": \"Sam\"}",
    "path": "/api/auth",
    "resource": "/{proxy+}",
    "queryStringParameters": {},
    "pathParameters": {
        "proxy": "users"
    },
    "headers": {
        "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
        "Accept-Encoding": "gzip, deflate, sdch, br",
        "Accept-Language": "en-US,en;q=0.8",
        "CloudFront-Forwarded-Proto": "https",
        "CloudFront-Is-Desktop-Viewer": "true",
        "CloudFront-Is-Mobile-Viewer": "false",
        "CloudFront-Is-SmartTV-Viewer": "false",
        "CloudFront-Is-Tablet-Viewer": "false",
        "CloudFront-Viewer-Country": "US",
        "Content-Type": "application/json",
        "Host": "xxxxxxxxxx.execute-api.us-east-1.amazonaws.com",
        "Upgrade-Insecure-Requests": "1",
        "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36",
        "Via": "1.1 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.cloudfront.net (CloudFront)",
        "X-Amz-Cf-Id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx_xxxxxxxxxxx_xxxx==",
        "X-Forwarded-For": "11.111.111.111, 11.111.111.111",
        "X-Forwarded-Port": "111",
        "X-Forwarded-Proto": "http",
        "x-apigateway-event": "hej"

    },
    "requestContext": {
        "accountId": "111111111111",
        "resourceId": "xxxxxx",
        "stage": "prod",
        "requestId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
        "identity": {
            "cognitoIdentityPoolId": "",
            "accountId": "",
            "cognitoIdentityId": "",
            "caller": "",
            "apiKey": "",
            "sourceIp": "11.111.111.111",
            "cognitoAuthenticationType": "",
            "cognitoAuthenticationProvider": "",
            "userArn": "",
            "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36",
            "user": ""
        },
        "resourcePath": "/{proxy+}",
        "httpMethod": "GET",
        "apiId": "xxxxxxxxxx"
    }
}

И файл шаблона для использования только для тестирования, который выглядит следующим образом:

AWSTemplateFormatVersion : '2010-09-09'
Transform: AWS::Serverless-2016-10-31

Description:
 A test project

Resources:
 Test:
  Type: AWS::Serverless::Function
  Properties:
   Runtime: nodejs10.x
   Handler: index.handler
   Timeout: 10
   Environment:
     Variables:
       NODE_ENV: "test"
       DB_NAME: "dbname"
       DB_USER: "dbuser"
       DB_PASSWORD: "secret"
       DB_URL: "dburl"

Код, который я использую, выглядит в обработчике следующим образом:

'use strict'
const awsServerlessExpress = require('aws-serverless-express')
const app = require('./main.js')

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

Тогда мой код работал замечательно, без тайм-аутов.

...