Nodejs return值获取不到,求解答
Nodejs return值获取不到,求解答
我在check_version.js文件中有如下代码: var fs = require(‘fs’); exports.version = function(path){ fs.readFile(path, ‘utf-8’, function(err, data){ if(err) throw err; var version = data.split(’=’); var version_num = version1.substr(1, 10) ; return version_num; }) ; } ;
我想return version_num的值,然后我在01.js文件中调用export的模块,代码如下:
01.js
var check_version = require(’./check_version.js’);
var assert = require(‘assert’);
//var expect = ‘0801004067’;
var path = ‘D:/nodejs/version.ini’;
var actual = check_version.version(path);
console.log(actual);
我执行01.js返回的结果是
console.log(actual);打印出来的是undefined,不知道为什么获取不到return的值
根据你提供的代码,问题在于fs.readFile
是一个异步函数,这意味着它不会立即返回结果。因此,你的version_num
值无法通过直接返回的方式获取。你需要使用回调函数来处理异步操作的结果。
以下是修改后的代码:
check_version.js
var fs = require('fs');
exports.version = function(path, callback) {
fs.readFile(path, 'utf-8', function(err, data) {
if (err) {
callback(err);
return;
}
var version = data.split('=');
var version_num = version[1].substr(1, 10);
callback(null, version_num);
});
};
01.js
var check_version = require('./check_version.js');
var assert = require('assert');
var path = 'D:/nodejs/version.ini';
check_version.version(path, function(err, version_num) {
if (err) {
console.error(err);
return;
}
console.log(version_num);
});
解释
-
异步处理:
fs.readFile
是一个异步函数,它需要一个回调函数来处理读取文件后的结果。因此,在check_version.js
中,我们将callback
作为参数传递给version
函数,并在读取文件后调用这个回调函数。 -
错误处理:在
fs.readFile
的回调函数中,我们首先检查是否有错误发生(if (err)
)。如果有错误,我们调用callback
并传递错误信息,这样可以在调用者处进行错误处理。 -
返回值:如果读取文件成功,我们提取版本号并将其作为第二个参数传递给
callback
。这样,调用者可以接收到这个值。 -
调用者:在
01.js
中,我们在调用check_version.version
时也传递了一个回调函数。这个回调函数接收两个参数:一个是可能的错误信息,另一个是版本号。当版本号可用时,我们将其打印到控制台。
通过这种方式,你可以正确地处理异步操作的结果,并避免在同步代码中等待异步操作完成的情况。
node里面要获得方法返回值一般不会直接用等号,像这样:var result=someFunction(); 而是传一个callback进去:
// the definition of the function
function someFunction(callback){
//do some work
callback('true')//invoke the callback to give it the result;
}
//invoke the function
someFunction(function callback(result){
//now you get the result;
});
将代码改成这样:
var fs = require('fs');
exports.version = function (path, callback) {
fs.readFile(path, 'utf-8', function (err, data) {
if (err) return callback(err);
var version = data.split('=');
var version_num = version1.substr(1, 10) ;
callback(null, version_num);
}) ;
} ;
这样获取版本:
check_version.version(path, function (err, actual) {
console.log(actual);
});
老雷霸气V5!
谢啦,学习了
或者改成这样:
var fs = require('fs');
exports.version = function (path) {
var data = fs.readFileSync(path, 'utf-8');
var version = data.split('=');
var version_num = version1.substr(1, 10) ;
return version_num;
} ;
这样获取版本:
var actual = check_version.version(path);
console.log(actual);
注意fs.readFile()和fs.readFileSync()的区别
后面那个是同步的方法吧
我想顺便问下,断言的功能不,我想加个断言判断下获取的那个version_num值是不是跟预期的一致,我加了个断言,但是貌似它没被执行,代码如下 var check_version = require(’./check_version.js’); var assert = require(‘assert’); var expect = ‘0801004067’; var path = ‘D:/nodejs/version.ini’; check_version.version(path, function(actual){ console.log(actual);
assert.equal(actual, expect,'they are expected');
assert.ok(true, 'testrtest');
});
从你提供的代码来看,问题出在 fs.readFile
是一个异步函数。这意味着 fs.readFile
的回调函数会在文件读取完成后执行,而此时你的函数可能已经返回了。因此你需要使用回调函数来处理异步操作的结果。
以下是修改后的 check_version.js
文件:
var fs = require('fs');
exports.version = function(path, callback) {
fs.readFile(path, 'utf-8', function(err, data) {
if (err) throw err;
var version = data.split('=');
var version_num = version[1].substr(1, 10);
callback(version_num);
});
};
然后在 01.js
文件中调用这个函数时需要传递一个回调函数:
var check_version = require('./check_version.js');
var assert = require('assert');
var path = 'D:/nodejs/version.ini';
check_version.version(path, function(actual) {
console.log(actual);
});
这样,当文件读取完成并解析出 version_num
后,会通过回调函数将结果传回给调用者,并在控制台中打印出来。