Как исправить ошибку mongoose typescript в AWS lambda?

#typescript #mongoose #serverless-framework

#typescript #mongoose #бессерверный фреймворк

Вопрос:

Я пытаюсь настроить простой вызов базы данных Mongo Atlas с использованием бессерверной платформы, AWS lambda и mongoose.

В настоящее время я настроен с использованием последней команды из serverless для typescript: create -t aws-nodejs-typescript

serverless.yaml

 plugins:
  - serverless-webpack

provider:
  name: aws
  runtime: nodejs8.10
  region: us-east-1
 

tsconfig.json

   "compilerOptions": {
    "moduleResolution": "node",
    "sourceMap": true,
    "target": "es2017",
    "module": "commonjs",
    "outDir": "lib",
    "removeComments": true,
    "pretty": true,
    "allowSyntheticDefaultImports": true,
    "esModuleInterop": true
  },
  "exclude": [
    "node_modules"
  ]
}
 

У меня есть файл, который импортируется для обработки фактического соединения.

connect.ts

 export const mongoose = require('mongoose')
export const Schema = mongoose.Schema

mongoose.Promise = global.Promise
let isConnected: boolean = false

export const connectToDatabase = () => {
  if (isConnected) {
    console.log('using existing database connection')
    return Promise.resolve()
  } else {
    console.log('using new database connection', { isConnected })
    return mongoose
      .connect(
        encodeURI(`${process.env.DB}`)
      )
      .then((db: any) => {
        console.log(db)
        isConnected = true
      })
  }
}
 

который затем импортируется в мои функции-обработчики.

handler.ts

 
import {
  connectToDatabase,
  defaultResponseHeader,
} from '../utils/mongo-helpers'
import { user } from '../utils/users'

module.exports.hello = async (event, context) => {
  console.log('started')
  context.callbackWaitsForEmptyEventLoop = false

  console.log(user)
  connectToDatabase().then(() => {
    console.log('in connect')
    const doc = user.findOne()
    console.log(doc)
    console.log(event)

    return doc
  })
}
 

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

   "errorMessage": "Unexpected token *",
  "errorType": "SyntaxError",
  "stackTrace": [
    "SyntaxError: Unexpected token *",
    "createScript (vm.js:80:10)",
    "Object.runInThisContext (vm.js:139:10)",
    "Module._compile (module.js:616:28)",
    "Object.Module._extensions..js (module.js:663:10)",
    "Module.load (module.js:565:32)",
    "tryModuleLoad (module.js:505:12)",
    "Function.Module._load (module.js:497:3)",
    "Module.require (module.js:596:17)",
    "require (internal/module.js:11:18)"
  ]
}
 

вместе со следующим журналом

 SyntaxError: Unexpected token *
    at createScript (vm.js:80:10)
    at Object.runInThisContext (vm.js:139:10)
    at Module._compile (module.js:616:28)
    at Object.Module._extensions..js (module.js:663:10)
    at Module.load (module.js:565:32)
    at tryModuleLoad (module.js:505:12)
    at Function.Module._load (module.js:497:3)
    at Module.require (module.js:596:17)
    at require (internal/module.js:11:18)
 

Похоже, это ошибка компиляции или из-за неправильного импорта.

Я пробовал разные версии импорта или требования mongoose, но, похоже, ничего не работает.

Любая помощь будет оценена.

Ответ №1:

По крайней мере, экспорт require(‘mongoose’) кажется чем-то ненужным.

То, что сработало для меня, просто соответствовало официальным рекомендациям: https://mongoosejs.com/docs/lambda.html

и с помощью serverless-plugin-typescript: https://github.com/prisma/serverless-plugin-typescript