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返回的结果是 enter image description here

console.log(actual);打印出来的是undefined,不知道为什么获取不到return的值


10 回复

根据你提供的代码,问题在于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);
});

解释

  1. 异步处理fs.readFile 是一个异步函数,它需要一个回调函数来处理读取文件后的结果。因此,在 check_version.js 中,我们将 callback 作为参数传递给 version 函数,并在读取文件后调用这个回调函数。

  2. 错误处理:在 fs.readFile 的回调函数中,我们首先检查是否有错误发生(if (err))。如果有错误,我们调用 callback 并传递错误信息,这样可以在调用者处进行错误处理。

  3. 返回值:如果读取文件成功,我们提取版本号并将其作为第二个参数传递给 callback。这样,调用者可以接收到这个值。

  4. 调用者:在 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 后,会通过回调函数将结果传回给调用者,并在控制台中打印出来。

回到顶部