将附加参数传递给 Node js 中 fs.readFile 的回调

Passing additional parameters to the callback of fs.readFile in Node js

本文关键字:fs readFile 回调 js Node 参数传递      更新时间:2023-09-26

是否可以将其他参数传递给fs.readFile的回调函数。我有我的代码来读取目录并解析所有 XML 文档。我需要将文件名向下传递回调链以进行其他处理。截至目前,我的代码是

var fs = require('fs');
var path = require('path');
module.exports.extractXMLBody = function (dirPath, ext) {
    fs.stat(dirPath, function (err, stats) {
        if (stats.isDirectory()) {
            fetchFiles(dirPath, ext, function (listOfFiles) {
                _.each(listOfFiles, function (val, key) {
                    var completePath = dirPath + '/' + val;
                    var fileName = path.basename(val, path.extname(val))
                    // TODO : Figure out to pass additional parameters
                    fs.readFile(fullPath, parseXML);
                });
            });
        }
    });
}

这里parseXML是我定义为单独函数的回调,我想将变量newFileName传递给回调函数parseXML

注意:如果我将回调编写为匿名函数,我可以传递变量的访问权限,但我试图避免回调的进一步嵌套。

不,您不能将其他值传递给回调函数,因为fs.readFile()不支持这样做。它始终只会将 2 个值传回回回调函数。它遵循错误优先回调结构,因此这意味着第一个参数将是 Error 或 null(如果未发生),下一个参数将包含文件的数据(如果有)。

如果要访问回调中的fileName变量以获取fs.readFile(),则需要在调用fs.readFile()的同一范围内定义它。这或多或少需要您使用匿名函数。但是,您仍应将其命名为更好的错误堆栈跟踪。

_.each(listOfFiles, function (val, key) {
  var completePath = dirPath + '/' + val;
  var fileName = path.basename(val, path.extname(val));
  fs.readFile(fullPath, function parseXML(err, data) {
    if(err) {
      console.log(err);
    }
    else {
      // parseXML and still have access to fileName
    }
  });
});

实际上,您现在有一种方法可以做到这一点。可以使用 .bind 函数将变量传递给回调函数。例如:

    for (file of files) {
      fs.readFile(`./${file}`, 'utf8', gotFile.bind({ "filename": file }))
}

在你的回调函数中(在我的例子中gotFile),你 van 使用变量文件名如下:

console.log(`Read ${this.file}.json`)

正如@Aditya评论的那样,.bind()解决了问题,但提供的代码对我不起作用,所以我让它像这样工作:

fs.readFile(fullPath, parseXML.bind(null, additionalParameter))
const parseXML = (additionalParameter, error, fileContents) => {
  console.log(additionalParameter)
}