NodeJS 在AWS Lambda上运行SQLite3

p5fdfcr1  于 2022-12-22  发布在  Node.js
关注(0)|答案(4)|浏览(244)

我正在尝试连接到我的node.js AWS Lambda函数的sqlite3数据库。当我在本地测试它时,代码运行完美,但当我上传到AWS Lambda时,我得到以下错误消息:

Error: Cannot find module '/var/task/node_modules/sqlite3/lib/binding/node-v48-linux-x64/node_sqlite3.node'
    at Function.Module._resolveFilename (module.js:469:15)
    at Function.Module._load (module.js:417:25)
    at Module.require (module.js:497:17)
    at require (internal/module.js:20:19)
    at Object.<anonymous> (/var/task/node_modules/sqlite3/lib/sqlite3.js:4:15)
    at Module._compile (module.js:570:32)
    at Object.Module._extensions..js (module.js:579:10)
    at Module.load (module.js:487:32)
    at tryModuleLoad (module.js:446:12)
    at Function.Module._load (module.js:438:3) code: 'MODULE_NOT_FOUND' }

AWS Lambda函数似乎尝试访问node-v48-linux-x64文件夹,该文件夹在我的npm安装中不存在,因为我使用Windows进行开发。
有人知道如何解决这个问题或如何获取node-v48-linux-x64文件夹的内容吗?

kr98yfug

kr98yfug1#

问题是您在Windows计算机上执行了npm install,然后将此node_modules目录与Lambda函数一起上传。
在Windows计算机上运行npm install基本上构建了sqlite包,其中包含Windows绑定,而不是AWS Lambda使用的Linux绑定。
解决方案是在Linux机器上执行npm install,然后将这个node_modules目录(在Linux上创建)与Lambda函数一起上传。
要做到这一点,你可以

vfhzx4xs

vfhzx4xs2#

安装sqlite3的跨平台版本可以解决此问题。首先在项目中安装sqlite3:

npm install sqlite3

然后全局安装node-pre-gyp:

npm install -g node-pre-gyp

并使用node-pre-gyp安装用于Linux的sqlite3

node-pre-gyp install --directory=./node_modules/sqlite3 --target_platform=linux --target_arch=x64
shstlldc

shstlldc3#

为了使本地构建能够在AWS lambda、architecture、platform和libc上工作,这三个参数应该在两台机器上匹配,特别是当您使用sqlite这样的包(或依赖项)时,sqlite使用预构建的二进制文件。
要在安装过程中为目标计算机指定arch、platform和libc,请使用以下命令。
对于国家预防机制

npm install --target_arch=arm64 --target_platform=linux --target_libc=glibc

用于Yarn

npm_config_target_arch=arm64 npm_config_target_platform=linux npm_config_target_libc=glibc yarn install

或者在使用之前导出它们

export npm_config_target_arch=arm64
export npm_config_target_platform=linux
export npm_config_target_libc=glibc

yarn install (or npm install)
7bsow1i6

7bsow1i64#

你可以很容易地生成一个lambda层并附加到你的lambda函数上。尝试https://nodelayer.xyz来生成一个lambda层并附加到你的函数上。这些层运行在Amazon Linux 2 docker映像上,这也是lambda运行时所使用的。

相关问题