使用 esbuild 捆绑express/sequelize/sqlite 应用程序时出现问题

问题描述 投票:0回答:1

编辑

我对续集部分感到困惑。负责连接网关的人员指向旧端点,结果返回错误的答案。我也是我的错,因为我只使用网关而不是直接进行测试,我也没有正确监控日志。

仍然不知道如何解决 sqlite 部分,如果有人能够照亮它,我将不胜感激。即使光是“这是不可能的,因为......”

原创

当我试图捆绑一个 Express 应用程序时,我遇到了困难,这样我就不必仅在 node_modules 上花费约 200MB 的存储空间。因此我以其他方式来到这里寻求帮助。问题来自于 Sequelize 和 sqlite3 模块,因为它们似乎没有按预期工作。

关于Sqlite

这个解释起来稍微简单一些。基本上,捆绑的 .js 文件本身没有 sqlite3 模块。

我尝试明确要求该模块,甚至传递给sequelize 实例的属性

dialectModule:
。如果我对包本身这样做,它将遇到各种依赖关系问题,一旦解决,输出如下:

Error: express-api-starter-ts package.json is not node-pre-gyp ready:
package.json must declare these properties:
binary
    at Object.gRe [as validate_config] (path\dist\index.js:137:219)
    at HM.find (path\dist\index.js:404:8282)
    at path\dist\index.js:406:166
    at path\dist\index.js:1:356
    at path\dist\index.js:411:108
    at path\dist\index.js:1:356
    at Object.<anonymous> (path\dist\index.js:413:12918)
    at Module._compile (node:internal/modules/cjs/loader:1241:14)
    at Module._extensions..js (node:internal/modules/cjs/loader:1295:10)
    at Module.load (node:internal/modules/cjs/loader:1091:32)

我还尝试将node_sqlite3模块编译成

.node
文件,并使用默认的esbuild .node加载器传递到相同的属性(但不知道我是否配置错误)并收到
this.lib.Database is not a constructor
错误。

所以我排序放弃了,只是将模块安装在服务器上的一个node_module包中并让它正常运行。它起作用了,但它并不如我所愿。

关于续集

当我解决了上一个问题并运行应用程序后,我注意到 REST 请求返回了一个答案,而没有考虑后续定义的模型。换句话说,如果代码中sequelize定义的结构是:

  "name": "John",
  "phone": "99999999",
  "birthdate": 23102020

返回的答案为(数据库中存在的相同列名称):

  "NAME": "John",
  "PHONE": "99999999",
  "BIRTHDATE": 23102020

结束思考

我想知道是否有人曾经经历过这种情况或类似的情况,并有如何解决它的答案。

我用来捆绑的命令是:

esbuild src/index.ts --platform=node --loader:.node=file --bundle --minify --outfile=dist/index.js

express sqlite bundler esbuild node-sqlite3
1个回答
0
投票

您可能需要考虑将无法找到的库标记为外部库。检查外部 esbuild 的文档

以下是此类构建脚本的示例:

const { build } = require('esbuild')
const glob = require('glob')
const entryPoints = glob.sync('./src/**/*.{ts,js}')

build({
  entryPoints,
  outbase: './src',
  outdir: './dist' ,
  platform: 'node',
  minify: true,
  bundle: true,
  external: ["pg-hstore", "aws-sdk", "lambda-core", "lambda-dal"] // Here you would put your library name that you want to ignore
})
© www.soinside.com 2019 - 2024. All rights reserved.