代码之家  ›  专栏  ›  技术社区  ›  Mopparthy Ravindranath

nodejs如何返回模块中fs失败的回调

  •  0
  • Mopparthy Ravindranath  · 技术社区  · 9 年前

    我刚进入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
    

    但对于失败,它表示回调未定义。

    1 回复  |  直到 9 年前
        1
  •  0
  •   Community CDub    7 年前

    正如预期的那样,您没有通过 callback 到您要导出的函数--它确实是 未定义 。只需在模块中的函数中添加一个匿名函数作为第三个参数,问题就会解决。

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