【问题标题】:nodejs how to return callback for fs failure in my modulenodejs如何在我的模块中返回fs失败的回调
【发布时间】:2015-11-01 09:50:47
【问题描述】:

我刚接触 node.js 两天。我正在尝试编写自己的模块,该模块使用 fs(文件系统)api。代码如下:

    var fs=require('fs');
    var path=require('path');

    // pkg file name constant
    const PKG_FILE = 'pkg.json';

    module.exports = function(srcDir, targetDir, callback) {
      console.log('checking dir: ', srcDir, '...');
      fs.readdir(srcDir, function(err, files) {
      // early return, in case of error.
      if (err) return callback(err);

    // look for pkg.json file and if found, iterate through
    // the list of components
    var pkgFile = path.join(srcDir, PKG_FILE);
    console.log(pkgFile);
    var pkg = fs.readFile(pkgFile, function(err, data) {
      if (err) return callback(err);

      var obj = JSON.parse(data);
      for (var attr in obj) {
        console.log(attr, " : ", obj[attr]);
      }
    });
  });
}

在上面的代码中,我试图通过语句返回给调用者

if (err) return callback(err);

但是,当发生 fs 错误时,我得到一个不同的错误,表明回调未定义。确切的错误如下:

rvnath@rv ~/projects/comviva/mbs/node/siteright $ node pkgtest.js riu3
checking dir:  riu3 ...
/home/rvnath/projects/comviva/mbs/node/siteright/libs/pkgcreator.js:17
    if (err) return callback(err);
                    ^
TypeError: undefined is not a function
    at /home/rvnath/projects/comviva/mbs/node/siteright/libs/pkgcreator.js:17:20
    at FSReqWrap.oncomplete (fs.js:95:15)

这是否意味着我不应该在嵌套闭包中调用“return callback(err)?

感谢任何人纠正我。

问候。

编辑 我正在使用我的模块,如下所示。

rvnath@rv ~/projects/comviva/mbs/node/siteright $ cat pkgtest.js 
var packager = require('./libs/pkgcreator');

packager(process.argv[2], function(err, files) {

    //if (err) {
         //console.log("some error occurred", err);
        //return;
    //}

    console.log("files listing...");
    files.forEach(function(file) {
        console.log(file);
    });
});

如果成功,我会正确得到结果。

checking dir:  /home/rvnath/projects/comviva/mbs/ecp/ecp_6.0 ...
/home/rvnath/projects/comviva/mbs/ecp/ecp_6.0/pkg.json
reading module:  smp3
reading module:  pushp
reading module:  bulkp
reading module:  drp
reading module:  mop
reading module:  ecp_ws
reading module:  ecp_admin

但是对于失败,它说回调未定义。

【问题讨论】:

  • 为什么在 module.exports 行定义的“回调”参数对嵌套闭包函数不可用?我在这里错过了什么?
  • 您确定它首先可用吗?您能否展示一下您是如何使用导出的模块的?

标签: node.js fs


【解决方案1】:

正如预期的那样,您没有将callback 传递给您正在导出的函数——它确实是未定义。只需将匿名函数作为第三个参数添加到模块中的函数,问题就应该消失了。

packager(process.argv[2], function(err, files) {
    // your code
}, function(err) {
    // The actual callback
    console.log('Sadly, something went wrong: ' + err);
});

【讨论】:

  • 好的,知道了。我的错!我的模块需要 3 个参数,而我只通过了 2 个。监督错误 :)
  • 没错,如果文件pkg.json 不存在,您将在第一次调用callback 函数时看到相同的未定义错误。干杯!
猜你喜欢
  • 2021-05-04
  • 1970-01-01
  • 2018-11-30
  • 2017-09-09
  • 1970-01-01
  • 2021-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多