【问题标题】:returning data in node js在节点js中返回数据
【发布时间】:2017-08-13 03:00:55
【问题描述】:

我的应用程序中有两个文件, DesignFactory.js:

var fs = require('fs');
var dotenv = require('dotenv');
dotenv.load();
var designtokenfile = require ('./designtokenfile');
var designtokendb = require ('./designtokendb');
var TYPE=process.env.TYPE;
var DesignFactory={};
DesignFactory.storeDesign = function(TYPE) {
if (TYPE == 'file') {
  var data=design.designtokenfile.load();
  console.log(data);

} else if (TYPE == 'db') {
  return designtokendb;
}
};

module.exports.design=DesignFactory;

现在,我有另一个 designtokenfile.js 文件, designtokenfile.js:

var fs = require('fs');
var load = function() {
fs.readFile('output.txt', 'utf8', function (err,data) {

  return data;
 if (err) {
   return console.log(err);
 }
    });

 };

 module.exports.load=load;

所以我的问题是无法从加载方法返回数据。当我在 load 函数返回的 storeDesign 方法中打印数据时,它显示未定义。 但我想要 storeDesign 方法中的 output.txt 的内容。 请帮帮我。

【问题讨论】:

标签: javascript node.js factory


【解决方案1】:

代替:

var load = function() {
  fs.readFile('output.txt', 'utf8', function (err, data) {
    return data;
     if (err) {
       return console.log(err);
     }
  });
};

因为永远无法到达return 之后的if,所以无法工作,请使用:

var load = function(cb) {
  fs.readFile('output.txt', 'utf8', function (err,data) {
     if (err) {
       console.log(err);
       return cb(err);
     }
     cb(null, data);
  });
};

并像这样使用它:

load((err, data) => {
  if (err) {
    // handle error
  } else {
    // handle success
  }
});

或者使用这个:

var load = function(cb) {
  return new Promise(resolve, reject) {
     fs.readFile('output.txt', 'utf8', function (err, data) {
       if (err) {
         console.log(err);
         reject(err);
       }
       resolve(data);
     });
  });
};

并像这样使用它:

load().then(data => {
    // handle success
}).catch(err => {
    // handle error
});

换句话说,您不能从回调函数中将值返回给异步函数。你的函数要么需要回调,要么返回一个 Promise。

您需要更多地了解 Node 的异步特性、承诺和回调。我可以推荐很多关于 Stack Overflow 的问题和答案:

【讨论】:

    【解决方案2】:

    fs.readFileist asynchrone 所以你需要传递一个回调函数或者使用fs.readFileSync

    【讨论】:

      【解决方案3】:

      由于异步性质,您收到undefined。尝试以下代码:

      var fs = require('fs');
      var load = function(callback) {
      fs.readFile('output.txt', 'utf8', function (err,data) {
      
        //return data;
         callback(null, data);
       if (err) {
         callback("error", null);
       }
          });
      
       };
      
       module.exports.load=load;
      
      var fs = require('fs');
      var dotenv = require('dotenv');
      dotenv.load();
      var designtokenfile = require ('./designtokenfile');
      var designtokendb = require ('./designtokendb');
      var TYPE=process.env.TYPE;
      var DesignFactory={};
      DesignFactory.storeDesign = function(TYPE) {
      if (TYPE == 'file') {
        var data=design.designtokenfile.load(function(err, res){
         if(err){
         } else {
          console.log(data);
         }
      }); 
      
      } else if (TYPE == 'db') {
        return designtokendb;
      }
      };
      
      module.exports.design=DesignFactory;
      

      【讨论】:

        猜你喜欢
        • 2018-10-14
        • 1970-01-01
        • 2019-03-06
        • 1970-01-01
        • 2012-10-19
        • 2014-06-28
        • 2013-12-31
        • 2018-10-06
        • 2019-11-12
        相关资源
        最近更新 更多