Nodejs Express函数未从fs.ReadFile返回变量



i在我的nodejs中具有以下功能,使用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
};

当我调用此功能时,count为零,但是,它是fs.readFile内的正确值。如何返回count的更新值?

作为fs.ReadFile是异步的,您需要使用回调或承诺。

回调:

function metaInfo (id, cb){
    var dir = 'files/'+id;
    var count = 0
    fs.readFile(__dirname +'/' + dir+'/myfile.json', 'utf8', function (err, data) {
        if (err) cb(err);
        obj = JSON.parse(data);
        var myArr = obj.nodes;
        var count = Object.keys(myArr).length;
        console.log("counting :", count)
        cb(null, count)
    });
};

您像这样使用它:

metaInfo(1, function(err, result) {
  if(err) throw err;
  console.log('Count:', result);
});

有承诺:

function metaInfo (id){
    return new Promise(function(resolve, reject) {
        var dir = 'files/'+id;
        var count = 0
        fs.readFile(__dirname +'/' + dir+'/myfile.json', 'utf8', function (err, data) {
            if (err) reject(err);
            obj = JSON.parse(data);
            var myArr = obj.nodes;
            var count = Object.keys(myArr).length;
            console.log("counting :", count);
            resolve(count);
        });
    });
};

您会这样使用它:

metaInfo(1)
    .then(function(count) { console.log('Count:', count); 
    .catch(function(error) { throw error; };

(请参阅https://developer.mozilla.org/en-us/docs/web/javascript/reference/global_objects/promise(

您还可以使用FS模块的ReadFileSync方法(https://nodejs.org/api/fs.html#fs_fs_fs_fs_readfilesync_file_options(

或异步/等待,但要注意兼容性(https://developer.mozilla.org/en-us/docs/web/javascript/reference/reference/statement/statement/ashync_function(

fs.readFile是一个异步函数,因此当您的功能返回count时,该文件尚未打开。

这是您可以做的:

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
});

使用fs.readFileSync

这是一个很好的例子

希望它有帮助,

最好的问候,

这是您的代码的异步问题。

您应该将" async"库用于nodejs。异步文档

对于典范,您可以包装:

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)
});

to:

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;
});

fs.ReadFile是一个异步调用。

您可以将函数用作回调并调用AD AD在异步调用的末端,也可以将您的呼叫包装在Promise

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;
})

最新更新