【问题标题】:nodejs express function not returning the variable from fs.readFilenodejs express函数不从fs.readFile返回变量
【发布时间】:2017-04-26 13:16:27
【问题描述】:

我的 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 的更新值?

【问题讨论】:

  • 如果您注销 myArr 会返回什么?
  • 您需要使用同步的 readFile 函数(google that),否则该回调函数中的代码会单独发生。

标签: javascript json node.js express


【解决方案1】:

由于 fs.readFile 是异步的,因此您需要使用回调或 Promise。

回调:

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_readfilesync_file_options)

或者 async/await,但要注意兼容性 (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function)

【讨论】:

  • 谢谢,我怎样才能包含两个 fs.readFile 并传递 count1 和 count2 作为函数的结果?
【解决方案2】:

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

Here is a good example

希望对你有帮助,

最好的问候,

【讨论】:

    【解决方案3】:

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

    您应该使用 NodeJS 的“异步”库。 Async documentation

    例如,你可以包装你的:

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

    收件人:

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

    【讨论】:

      【解决方案4】:

      fs.readFile 是一个异步调用。

      您可以将函数用作回调并在异步调用结束时调用它,或者您可以将调用包装在 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;
      })
      

      【讨论】:

        猜你喜欢
        • 2016-09-16
        • 1970-01-01
        • 2021-09-25
        • 2019-05-10
        • 2014-07-20
        • 2016-10-02
        • 2012-09-10
        • 2016-07-09
        相关资源
        最近更新 更多