在节点js

时间:2017-03-21 12:30:45

标签: javascript node.js factory

我的应用程序中有两个文件, 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方法返回数据。当我在从load函数返回的storeDesign方法中打印数据时,它显示undefined。 但我想在storeDesign方法中输出output.txt的内容。 请帮帮我。

3 个答案:

答案 0 :(得分:1)

而不是:

var load = function() {
  fs.readFile('output.txt', 'utf8', function (err, data) {
    return data;
     if (err) {
       return console.log(err);
     }
  });
};
由于永远无法联系到if之后的return

无法正常工作,请使用此功能:

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

换句话说,您无法将回调值返回到异步函数。您的函数需要进行回调或返回承诺。

你需要更多地了解Node的异步性,关于promises和回调。我可以推荐在Stack Overflow上有很多的问题和答案:

答案 1 :(得分:0)

fs.readFile ist asynchrone,因此您需要传递回调函数或使用fs.readFileSync

答案 2 :(得分:0)

由于异步性质,您获得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;