我的应用程序中有两个文件, 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的内容。 请帮帮我。
答案 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;