读取aws lambda包中的打包文件

时间:2016-12-09 15:00:25

标签: node.js amazon-web-services lambda aws-lambda

我有一个非常简单的节点lambda函数,它读取其中的打包文件的内容。我将代码上传为zip文件。目录结构如下。

index.js
readme.txt

然后在我的index.js文件中:

fs.readFile('/var/task/readme.txt', function (err, data) {
if (err) throw err;
});

我一直收到以下错误NOENT:没有这样的文件或目录,请打开'/var/task/readme.txt'.

我也试过./readme.txt。

我错过了什么?

6 个答案:

答案 0 :(得分:22)

试试这个,它对我有用:

'use strict'

let fs = require("fs");
let path = require("path");

exports.handler = (event, context, callback) => {
        // To debug your problem
        console.log(path.resolve("./readme.txt"));

        // Solution is to use absolute path using `__dirname`
        fs.readFile(__dirname +'/readme.txt', function (err, data) {
            if (err) throw err;
        });
};

调试代码无效的原因,在处理程序中添加以下链接

console.log(path.resolve("./readme.txt"));

在AWS Lambda节点上,进程可能正在从其他某个文件夹运行,它会从您提供readme.txt路径的文件夹中查找relative文件,解决方案是使用absolute路径。

答案 1 :(得分:4)

这是一个古老的问题,但在尝试弄清Lambda上文件路径的问题时首先出现。

无服务器框架的其他步骤

对于使用无服务器框架进行部署(可能使用webpack进行构建)的任何人,您还需要将以下内容添加到webpack配置文件中(紧随target: node之后):

  // assume target: 'node', is here

  node: {
    __dirname: false,
  },

如果没有使用__dirname和Serverless一起使用,则仍然无法获得所需的绝对目录路径。

答案 2 :(得分:2)

我使用无服务器框架进行了此操作,实际上是压缩中未发送的文件。只需在serverless.yml中添加以下行:

package:
  individually: false
  include:
    - src/**

答案 3 :(得分:1)

对我有用的是Vadorrequest使用process.env.LAMBDA_TASK_ROOT的{​​{3}}。当我在计算机上以__dirname或在Lambda上使用/templates变量在本地运行本机时,我编写了一个函数来获取process.env.LAMBDA_TASK_ROOT目录中的模板文件:

function loadTemplateFile(templateName) {
  const fileName = `./templates/${templateName}`
  let resolved
  if (process.env.LAMBDA_TASK_ROOT) {
    resolved = path.resolve(process.env.LAMBDA_TASK_ROOT, fileName)
  } else {
    resolved = path.resolve(__dirname, fileName)
  }
  console.log(`Loading template at: ${resolved}`)
  try {
    const data = fs.readFileSync(resolved, 'utf8')
    return data
  } catch (error) {
    const message = `Could not load template at: ${resolved}, error: ${JSON.stringify(error, null, 2)}`
    console.error(message)
    throw new Error(message)
  }
}

答案 4 :(得分:0)

const filepath = path.resolve('../../ filename.text');

const fileData2 = fs.readFileSync(process.env.LAMBDA_TASK_ROOT + filepath,'utf-8');

答案 5 :(得分:0)

我使用的是 fs.promises.readFile()。无法让它出错。文件就在那里,而且 LAMBDA_TASK_ROOT 对我来说也是正确的。在我更改为 fs.readFileSync() 后,它起作用了。