J'ai une fonction lambda de nœud très simple qui lit le contenu du fichier emballé. Je télécharge le code sous forme de fichier Zip. La structure du répertoire est la suivante.
index.js
readme.txt
Ensuite, ayez dans mon fichier index.js:
fs.readFile('/var/task/readme.txt', function (err, data) {
if (err) throw err;
});
Je reçois toujours l'erreur suivante NOENT: aucun fichier ou répertoire de ce type, ouvrez '/var/task/readme.txt'.
J'ai également essayé ./readme.txt.
Qu'est-ce que je rate ?
Essayez ceci, cela fonctionne pour moi:
'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;
});
};
pour déboguer pourquoi votre code ne fonctionne pas, ajoutez le lien ci-dessous dans votre gestionnaire
console.log(path.resolve("./readme.txt"));
Sur le nœud AWS Lambda, le processus peut s'exécuter à partir d'un autre dossier et il recherche readme.txt
fichier de ce dossier comme vous avez fourni relative
chemin, la solution consiste à utiliser absolute
chemin.
Il s'agit d'une question ancienne, mais qui apparaît en premier lorsque vous essayez de trier ce qui se passe avec les chemins de fichiers sur Lambda.
Pour toute personne utilisant un environnement sans serveur à déployer (qui utilise probablement webpack pour construire), vous devrez également ajouter ce qui suit à votre fichier de configuration webpack (juste après target: node
):
// assume target: 'node', is here
node: {
__dirname: false,
},
Sans cet élément, l'utilisation de __dirname avec Serverless ne vous donnera TOUJOURS PAS le chemin de répertoire absolu souhaité.
Ce qui a fonctionné pour moi, c'est le commentaire par Vadorrequest d'utiliser process.env.LAMBDA_TASK_ROOT
. J'ai écrit une fonction pour obtenir un fichier de modèle dans un /templates
répertoire lorsque je l'exécute localement sur ma machine avec __dirname ou avec le process.env.LAMBDA_TASK_ROOT
variable lors de l'exécution sur 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)
}
}