超级个体必备——云函数FC快速部署 Nest.js 服务

299 阅读3分钟

超级个体必备——云函数FC快速部署 Nest.js 服务

背景:Nest.js 默认模板的“坑”

之前写了 Next.js 的部署方法《超级个体必备——云函数FC快速部署 Next.js 服务》,这次写一下 Nest.js 的,FC 就能覆盖差不多所有的场景了,基本就齐活了。

部署流程

  1. 本地初始化 Nest.js 项目;
  2. 项目上传到 Git;
  3. 基于 Nest.js 模板 创建 FC 应用;
  4. 绑定 Git 仓库自动部署;

上面这几部就不展开了,可以参考 Next.js 的那篇文章,最关键的是修改构建命令,如下:

  • 调整构建命令(默认情况下路径存在问题,需手动修正):

    • 在路径 ./ 下运行 npm install
    • 在路径 ./ 下运行 npm run build
  • 调整代码包路径

    • 设置代码包路径为 ./。注意不是 ./dist,否则会报类似下面的错误,我至今也不知道是怎么回事。
{
  "RequestId": "1-680270bf-157fdf08-44fe63d29483",
  "Code": "CAExited",
  "Message": "Function instance exited unexpectedly(code 1, message:operation not permitted) with start command 'node main'.\nLogs:node:internal/modules/cjs/loader:1147\r\n  throw err;\r\n  ^\r\n\r\nError: Cannot find module '@nestjs/core'\r\nRequire stack:\r\n- /code/main.js\r\n\u001B[90m    at Module._resolveFilename (node:internal/modules/cjs/loader:1144:15)\u001B[39m\r\n\u001B[90m    at Module._load (node:internal/modules/cjs/loader:985:27)\u001B[39m\r\n\u001B[90m    at Module.require (node:internal/modules/cjs/loader:1235:19)\u001B[39m\r\n\u001B[90m    at require (node:internal/modules/helpers:176:18)\u001B[39m\r\n    at Object.\u003Canonymous\u003E \u001B[90m(/code/\u001B[39mmain.js:3:16\u001B[90m)\u001B[39m\r\n\u001B[90m    at Module._compile (node:internal/modules/cjs/loader:1376:14)\u001B[39m\r\n\u001B[90m    at Module._extensions..js (node:internal/modules/cjs/loader:1435:10)\u001B[39m\r\n\u001B[90m    at Module.load (node:internal/modules/cjs/loader:1207:32)\u001B[39m\r\n\u001B[90m    at Module._load (node:internal/modules/cjs/loader:1023:12)\u001B[39m\r\n\u001B[90m    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:135:12)\u001B[39m {\r\n  code: \u001B[32m'MODULE_NOT_FOUND'\u001B[39m,\r\n  requireStack: [ \u001B[32m'/code/main.js'\u001B[39m ]\r\n}\r\n\r\nNode.js v20.11.0"
}
  • 运行时:启动命令
    • 端口记得改成 3000
    • 命令改为 node ./dist/main.js 或者在项目里新建一个 bootstrap 文件,输入下面的代码
#!/bin/bash
node ./dist/main.js

改完上面这些,部署一下,看看是否能正常访问,就可以了。

总结

之所以想折腾 Nest.js,还是因为用 Express 手搓太麻烦了,而且相加 ts 也比较麻烦。

我一般用 Nest.js 做一些纯接口服务,比如服务端调用请求绕过跨域限制、服务端封装一些 SDK,以接口的形式暴露出来,还有一些通用的服务。

搞起来也不算麻烦,就是开发的时候有 ts,还是会稍微麻烦点的。

不过这正是想要的效果,强约束嘛~

对了,默认的构建环境中 Nodejs 的版本是 20.8.1,npm 的版本是 10.1.0,本地开发的时候尽量用一致的。

关注我,掌握更多云开发省钱妙招AI 提效技巧~