rOr*_*lig 13 lambda amazon-web-services node.js aws-lambda
我有一个非常简单的节点lambda函数,它读取其中的打包文件的内容.我将代码上传为zip文件.目录结构如下.
index.js
readme.txt
Run Code Online (Sandbox Code Playgroud)
然后在我的index.js文件中:
fs.readFile('/var/task/readme.txt', function (err, data) {
if (err) throw err;
});
Run Code Online (Sandbox Code Playgroud)
我一直收到以下错误NOENT:没有这样的文件或目录,打开 '/var/task/readme.txt'.
我也试过./readme.txt.
我错过了什么?
jay*_*aym 25
试试这个,它对我有用:
'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;
});
};
Run Code Online (Sandbox Code Playgroud)
要调试代码无法正常工作的原因,请在处理程序中添加以下链接
console.log(path.resolve("./readme.txt"));
Run Code Online (Sandbox Code Playgroud)
在AWS Lambda节点进程可能正在从某个其他文件夹运行,并且它readme.txt
在您提供relative
路径时从该文件夹中查找文件,解决方案是使用absolute
路径.
什么工作对我来说是评论通过Vadorrequest使用process.env.LAMBDA_TASK_ROOT
。/templates
当我在我的机器上使用 __dirname 或process.env.LAMBDA_TASK_ROOT
在 Lambda 上运行时使用变量本地运行它时,我编写了一个函数来获取目录中的模板文件:
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)
}
}
Run Code Online (Sandbox Code Playgroud)
这是一个古老的问题,但在尝试整理Lambda上文件路径的内容时首先出现。
对于使用无服务器框架进行部署(可能使用webpack进行构建)的任何人,您还需要将以下内容添加到webpack配置文件中(紧随其后target: node
):
// assume target: 'node', is here
node: {
__dirname: false,
},
Run Code Online (Sandbox Code Playgroud)
如果不使用__dirname和Serverless,则仍然无法获得所需的绝对目录路径。
归档时间: |
|
查看次数: |
12193 次 |
最近记录: |