fs.readFileSync 使用 lambda 部署时找不到文件

fs.readFileSync cannot find file when deploying with lambda

在我的代码中,我从我的 lambda 函数调用查询

let featured_json_data = JSON.parse(fs.readFileSync('data/jsons/featured.json'))

这在本地有效,因为我的 featured.json 在我正在读取的目录中。但是,当我使用无服务器部署时,它生成的 zip 文件没有这些文件,我得到一个

ENOENT: no such file directory, open...

我尝试通过添加

来打包
package: 
include: 
 - data/jsons/featured.json

但这就是行不通。我让它工作的唯一方法是手动添加 json 文件,然后更改我编译的 handler.js 代码以从根目录中的 json 文件读取。

在此屏幕截图中,我必须添加 jsons,然后再次手动上传并在编译的 handler.js 代码中更改目录以排除 data/jsons

我想在我的 servereless.yml

中实际处理这个问题

fs.readFileSync cannot find file when deploying with lambda

检查当前目录并检查部署环境中的目标目录内容。将用于该检查的适当代码添加到您的 program/script.

您可以使用 require().

加载 JSON 个文件
const featured_json_data = require('./featured.json')

或者更好的是,将您的 JSON 转换为 JS!

我建议查看 copy-webpack-pluginhttps://github.com/webpack-contrib/copy-webpack-plugin

您可以使用它来打包其他文件以包含在您的 Lambda 部署中。

在我的项目中,/templates 目录中有一堆文件。在 webpack.config.js 中打包这些模板,对我来说它看起来像:

const CopyWebpackPlugin = require('copy-webpack-plugin');

module.exports = {
  plugins: [
    new CopyWebpackPlugin([
      './templates/*'
    ])
  ]
};

对于非 JSON 文件的处理,我发现 process.cwd() 在大多数情况下都适合我。例如:

const fs = require('fs');
const path = require('path');

export default async (event, context, callback) => {
  try {
    console.log('cwd path', process.cwd());

    const html = fs.readFileSync(
      path.resolve(process.cwd(), './html/index.html'),
      'utf-8'
    );

    const response = {
      statusCode: 200,
      headers: {
        'Content-Type': 'text/html'
      },
      body: html
    };

    callback(null, response);
  } catch (err) {
    console.log(err);
  }
};