如何在Serverless Framework中包含静态文件?NodeJS Lambda场景疑问
解决Serverless Framework部署Lambda时静态文件(schema.json)未被打包的问题
我之前也碰到过一模一样的坑!别着急,咱们一步步排查解决:
1. 先确认文件路径和拼写绝对正确
Serverless的配置路径是相对于serverless.yml所在的项目根目录的,而且Lambda运行在Linux环境下,路径是大小写敏感的!
- 先在本地终端执行命令确认文件存在:
- Mac/Linux:
ls libs/schemas/schema.json - Windows:
dir libs\schemas\schema.json
- Mac/Linux:
- 检查配置里的路径有没有拼写错误,比如把
schemas写成schema,或者大小写不一致。
2. 检查默认排除规则的影响
Serverless会自动继承.gitignore和.npmignore里的排除规则,这是最容易踩的坑!
- 打开你的
.gitignore/.npmignore,看看有没有类似*.json、libs/schemas/这样的规则,如果有,会直接把你的schema文件排除在外。 - 解决方法:
- 要么在
.gitignore里添加例外:!libs/schemas/schema.json(感叹号表示不排除该文件) - 要么在
serverless.yml的package配置里明确覆盖排除规则,比如:package: include: - libs/schemas/schema.json exclude: - node_modules/** # 只排除必要的依赖文件,避免默认规则干扰
- 要么在
3. 调整Serverless的package配置写法
有时候全局配置的写法需要更明确,或者如果开启了函数独立打包,要单独配置:
- 如果你的service是全局打包(
individually: false,默认值),确保package配置里包含了所有必要文件,比如handler.js和静态文件:service: feed-validator-service provider: name: aws runtime: nodejs18.x package: individually: false include: - handler.js - libs/schemas/schema.json functions: validateFeed: handler: handler.validate - 如果开启了
individually: true(每个函数单独打包),需要在对应的函数配置里添加include:functions: validateFeed: handler: handler.validate package: include: - libs/schemas/schema.json
4. 在Lambda函数里用正确的路径读取文件
就算文件打包进去了,读取路径错了也会报找不到!Lambda的工作目录是部署包的根目录,建议用Node的path模块生成绝对路径,避免相对路径的坑:
const path = require('path'); // __dirname 是当前handler文件所在的目录,确保路径拼接正确 const schemaPath = path.join(__dirname, 'libs', 'schemas', 'schema.json'); const schema = require(schemaPath);
5. 手动验证打包结果
执行sls package后,打包文件默认存放在.serverless目录下,解压对应的zip包,直接查看libs/schemas/schema.json是否存在:
- 如果文件不在包里:回到前面的步骤检查配置和排除规则
- 如果文件在包里但Lambda还是找不到:检查代码里的读取路径是否正确
内容的提问来源于stack exchange,提问作者yabune
相关产品推荐
相关产品推荐

