我有一个非常简单的节点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。
我错过了什么?
答案 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()
后,它起作用了。