热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

AWSLambdaNodeJS导入返回空模块,但仅在AWS中

已更新尝试调用我的Lambda函数时出现以下错误{"errorType":"TypeErr

已更新

尝试调用我的Lambda函数时出现以下错误

{
"errorType": "TypeError","errorMessage": "e is not a function","trace": [
"TypeError: e is not a function"," at Runtime.handler (/var/task/serverless_sdk/index.js:9:88355)"," at Runtime.handleonce (/var/runtime/Runtime.js:66:25)"
]
}

我已将其追溯到对DB的引用(请参阅schema.js的最后几行,应将DB导入schema.js的顶部

const { DB } = require('./db.js')

实际上,当我在本地计算机上尝试相同的代码时,没有问题。

这是否与冻结Lambda函数(LF)以便在AWS中重用的一些微妙方式有关?我应该在哪里初始化LF中的数据库连接?

我尝试将db.js合并到schema.js中(不导入),但仍然遇到相同的错误。
我已经检查了无服务器加载的zip文件,它看起来不错(node_modules和我的)。

这很难调试。因此,朝着这个方向的任何提示都会有所帮助。



server.js

const { ApolloServer } = require('apollo-server')
const { ApolloServer: ApolloServerLambda } = require('apollo-server-lambda')
const { typeDefs,resolvers,connect } = require('./schema.js')
// The ApolloServer constructor requires two parameters: your schema
// definition and your set of resolvers.
async function setup(where) {
if (where == 'local') {
const server = new ApolloServer({ typeDefs,resolvers })
let { url } = await server.listen()
console.log(`Server ready at ${url}`)
} else {
const server = new ApolloServerLambda({
typeDefs,playground: true,introspection: true,cors: {
origin: '*',credentials: true,},context: ({ event,context }) => (
{
headers: event.headers,functionName: context.functionName,event,context
})
})
exports.graphqlHandler = server.createHandler()
}
}
let location = (process.env.username == 'ysg4206') ? 'local' : 'aws'
connect(location,setup)



schema.js

const { gql } = require('apollo-server')
const { GraphQLDateTime } = require('graphql-iso-date')
const { DB } = require('./db.js')
exports.typeDefs = gql`
scalar DateTime
type User {
id: Int
"English First Name"
firstName: String
lastName: String
addressnumber: Int
streetName: String
city: String
email: String
createdAt: DateTime
updatedAt: DateTime
}
type Query {
users: [User]
findUser(firstName: String): User
hello(reply: String): String
}
type Mutation {
addUser(user: UserType): User!
}
type Subscription {
newUser: User!
}
`
exports.resolvers = {
Query: {
users: () => DB.findAll(),findUser: async (_,{ firstName }) => {
let who = await DB.findFirst(firstName)
return who
},hello: (_,{ reply },context,info) => {
console.log(`hello with reply ${reply}`)
console.log(`context : ${JSON.stringify(context)}`)
console.log(`info : ${JSON.stringify(info)}`)
return reply
}
},Mutation: {
addUser: async (_,args) => {
let who = await DB.addUser(args.user)
return who
}
}
}
exports.cOnnect= async (where,setup) => {
console.log(`DB: ${DB}') // BUG DB is returning null
await DB.dbSetup(where) //BUG these lines cause Lambda to fail
await DB.populate() //BUG these lines cause Lambda to fail
let users = await DB.findAll() //BUG these lines cause Lambda to fail
console.log(users) //BUG these lines cause Lambda to fail
await setup(where)
}



db.js

const { Sequelize } = require('sequelize')
const { userData } = require('./userData')
const localHost = {
db: 'm3_db',host: 'localhost',pass: 'xxxx'
}
const awsHost = {
db: 'mapollodb3_db',host: 'apollodb.cxeokcheapqj.us-east-2.rds.amazonaws.com',pass: 'xxxx'
}
class DB {
async dbSetup(where) {
let host = (where == "local") ? localHost : awsHost
this.db = new Sequelize(host.db,'postgres',host.pass,{
host: host.host,dialect: 'postgres',logging: false,pool: {
max: 5,min: 0,idle: 20000,handleDisconnects: true
},dialectOptions: {
requestTimeout: 100000
},define: {
freezetableName: true
}
})
this.User = this.db.define('users',{
firstName: Sequelize.STRING,lastName: Sequelize.STRING,addressnumber: Sequelize.INTEGER,streetName: Sequelize.STRING,city: Sequelize.STRING,email: Sequelize.STRING,})
try {
await this.db.authenticate()
console.log('Connected to DB')
} catch (err) {
console.error('Unable to connect to DB',err)
}
}
async select(id) {
let who = await this.User.findAll({ where: { id: id } })
return who.get({ plain: true })
}
async findFirst(name) {
let me = await this.User.findAll({ where: { firstName: name } })
return me[0].get({ plain: true })
}
async addUser(user) {
let me = await this.User.create(user)
return me.get({ plain: true })
}
async populate() {
await this.db.sync({ force: true })
try {
await this.User.bulkCreate(userData,{ validate: true })
console.log('users created');
} catch (err) {
console.error('failed to create users')
console.error(err)
} finally {
}
}
async findAll() {
let users = await this.User.findAll({ raw: true })
return users
}
async close() {
this.db.close()
}
}
exports.DB = new DB()



serverless.yml

service: apollo-lambda
provider:
name: aws
stage: dev
region: us-east-2
runtime: nodejs10.x
# cfnRole: arn:aws:iam::237632220688:role/lambda-role
functions:
graphql:
# this is formatted as .
handler: server.graphqlHandler
vpc:
securityGroupIds:
- sg-a1e6f4c3
subnetIds:
- subnet-4a2a7830
- subnet-1469d358
- subnet-53b45038
events:
- http:
path: graphql
method: post
cors: true
- http:
path: graphql
method: get
cors: true

zip的文件夹结构

AWS Lambda NodeJS导入返回空模块,但仅在AWS中


AWS Lambda导入文件时,导出尚不可用。这就是为什么它抱怨您的处理程序不是函数(因为实际上它在导入时实际上是undefined)。

以下是一些建议的解决方案:

1。仅使用apollo-server-lambda并使用serverless-offline进行本地开发。这样,您的处理程序代码与Lambda中的代码完全相同。

const { ApolloServer: ApolloServerLambda } = require("apollo-server-lambda");
const { typeDefs,resolvers,connect } = require("./schema.js");
const server = new ApolloServerLambda({
typeDefs,playground: true,introspection: true,cors: {
origin: "*",credentials: true
},context: ({ event,context }) => ({
headers: event.headers,functionName: context.functionName,event,context
})
});
exports.graphqlHandler = server.createHandler();

2。在Lambda中使用apollo-server-lambda,但在另一个文件(例如local.js)中使用apollo-server。然后,只需使用node local.js进行本地开发。无需process.env.USERNAME进行最后检查。

,

发现了问题。有点尴尬。但是我把它贴出来,以防其他人需要。

作为lambda应用程序初始化的一部分,我试图连接到数据库。希望当冷启动或热启动发生时,带有DB的变量将已经保持连接。

那是反模式。

使用阿波罗时,必须在每次请求时重新连接到数据库。必须在GraphQL解析器中进行重新连接,然后关闭它,以便AWS可以看到没有打开的连接,然后关闭Lambda函数。

让我吃惊的是,当作为ApolloServer运行并连接到本地数据库时,此方法工作正常。


推荐阅读
  • 本文详细介绍了网络存储技术的基本概念、分类及应用场景。通过分析直连式存储(DAS)、网络附加存储(NAS)和存储区域网络(SAN)的特点,帮助读者理解不同存储方式的优势与局限性。 ... [详细]
  • FinOps 与 Serverless 的结合:破解云成本难题
    本文探讨了如何通过 FinOps 实践优化 Serverless 应用的成本管理,提出了首个 Serverless 函数总成本估计模型,并分享了多种有效的成本优化策略。 ... [详细]
  • 深入解析Serverless架构模式
    本文将详细介绍Serverless架构模式的核心概念、工作原理及其优势。通过对比传统架构,探讨Serverless如何简化应用开发与运维流程,并介绍当前主流的Serverless平台。 ... [详细]
  • 云函数与数据库API实现增删查改的对比
    本文将深入探讨使用云函数和数据库API实现数据操作(增删查改)的不同方法,通过详细的代码示例帮助读者更好地理解和掌握这些技术。文章不仅提供代码实现,还解释了每种方法的特点和适用场景。 ... [详细]
  • MySQL 数据库迁移指南:从本地到远程及磁盘间迁移
    本文详细介绍了如何在不同场景下进行 MySQL 数据库的迁移,包括从一个硬盘迁移到另一个硬盘、从一台计算机迁移到另一台计算机,以及解决迁移过程中可能遇到的问题。 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 本文由瀚高PG实验室撰写,详细介绍了如何在PostgreSQL中创建、管理和删除模式。文章涵盖了创建模式的基本命令、public模式的特性、权限设置以及通过角色对象简化操作的方法。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • 本文总结了在使用Ionic 5进行Android平台APK打包时遇到的问题,特别是针对QRScanner插件的改造。通过详细分析和提供具体的解决方法,帮助开发者顺利打包并优化应用性能。 ... [详细]
  • 本文介绍了在Windows环境下使用pydoc工具的方法,并详细解释了如何通过命令行和浏览器查看Python内置函数的文档。此外,还提供了关于raw_input和open函数的具体用法和功能说明。 ... [详细]
  • 本文深入探讨了 Java 编程语言的基础,特别是其跨平台特性和 JVM 的工作原理。通过介绍 Java 的发展历史和生态系统,帮助初学者理解如何编写并运行第一个 Java 程序。 ... [详细]
  • 本文将介绍网易NEC CSS框架的规范及其在实际项目中的应用。通过详细解析其分类和命名规则,探讨如何编写高效、可维护的CSS代码,并分享一些实用的学习心得。 ... [详细]
  • 本文详细介绍了 org.apache.commons.io.IOCase 类中的 checkCompareTo() 方法,通过多个代码示例展示其在不同场景下的使用方法。 ... [详细]
  • 本题要求在一组数中反复取出两个数相加,并将结果放回数组中,最终求出最小的总加法代价。这是一个经典的哈夫曼编码问题,利用贪心算法可以有效地解决。 ... [详细]
author-avatar
qCANL
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有