Tengo la siguiente función en mi nodejs, usando express.
function metaInfo (id){ var dir = 'files/'+id; var count = 0 fs.readFile(__dirname +'/' + dir+'/myfile.json', 'utf8', function (err, data) { if (err) throw err; obj = JSON.parse(data); var myArr = obj.nodes; var count = Object.keys(myArr).length; console.log("counting :", count) }); return count }; cuando llamo a esta función, el count es cero, sin embargo, es el valor correcto dentro de fs.readFile . ¿Cómo puedo devolver el valor actualizado de count ?
fs.readFile es una función asíncrona, por lo que cuando su función devuelve count , el archivo aún no se ha abierto.
Esto es lo que puedes hacer:
function metaInfo (id, callback){ var dir = 'files/'+id; var count = 0 fs.readFile(__dirname +'/' + dir+'/myfile.json', 'utf8', function (err, data) { if (err) throw err; obj = JSON.parse(data); var myArr = obj.nodes; count = Object.keys(myArr).length; callback(count); }); }; metaInfo("yourId", function(count) { // Here is your count });O
usar fs.readFileSync
Espero eso ayude,
Saludos,
fs.readFile es una llamada asíncrona.
puede usar una función como devolución de llamada e invocarla al final de su llamada asíncrona o puede envolver su llamada en una promesa
var Promise = require('bluebird'); var MyReadFileAsync = function (filename) { return new Promise(function (resolve, reject) { fs.readFile(filename, 'utf8', function (err, data) { if (err) reject(err); obj = JSON.parse(data); var myArr = obj.nodes; resolve(Object.keys(myArr).length); }); }); }; MyReadFileAsync(__dirname +'/' + dir+'/myfile.json').then(function(counter){ var myCounterUpdated = counter; })Es un problema asíncrono con su código.
Debería usar la biblioteca "async" para NodeJS. Documentación asíncrona
Por ejemplo, puede envolver su:
fs.readFile(__dirname +'/' + dir+'/myfile.json', 'utf8', function (err, data) { if (err) throw err; obj = JSON.parse(data); var myArr = obj.nodes; var count = Object.keys(myArr).length; console.log("counting :", count) });Para :
async.waterfall([ function(callback) { fs.readFile(__dirname +'/' + dir+'/myfile.json', 'utf8', function (err, data) { if (err) throw err; obj = JSON.parse(data); var myArr = obj.nodes; var count = Object.keys(myArr).length; console.log("counting :", count); callback(null, count); }); } ], function (err, result) { // result now equals = count return result; });