nodejs 如何 return 回调我的模块中的 fs 失败
nodejs how to return callback for fs failure in my module
我刚进入 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]);
}
});
});
}
在上面的代码中,我试图通过
语句 return 给调用者
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
但是对于失败,它说回调未定义。
正如预期的那样,您没有将 callback 传递给要导出的函数——它确实是 undefined。只需将匿名函数作为第三个参数添加到模块中的函数,问题就会消失。
packager(process.argv[2], function(err, files) {
// your code
}, function(err) {
// The actual callback
console.log('Sadly, something went wrong: ' + err);
});
我刚进入 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]);
}
});
});
}
在上面的代码中,我试图通过
语句 return 给调用者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
但是对于失败,它说回调未定义。
正如预期的那样,您没有将 callback 传递给要导出的函数——它确实是 undefined。只需将匿名函数作为第三个参数添加到模块中的函数,问题就会消失。
packager(process.argv[2], function(err, files) {
// your code
}, function(err) {
// The actual callback
console.log('Sadly, something went wrong: ' + err);
});