读取目录中的docx文件并在节点中合并内容?

时间:2018-12-30 08:06:53

标签: node.js file docx

需要代码才能读取目录中的所有文件,并返回该目录中每个docx文件中的所有内容。

我正在使用glob和猛mm象库分别读取目录和docx文件。但是,我想将每个文件内容合并为一个更大的内容。但是由于节点是异步的,因此我编写的代码将在读取每个文件之前将空白内容传递给我。

var mammoth = require("mammoth");
var glob = require("glob");
function readAllFiles(dir){

  var data_collection = '';
  return new Promise(async(resolve, reject) => {
    // reading the directory
    glob(dir,  function (er, files) { 
      console.log(files);
      // for each file in the directory read its content
      _.map(files, function(file){
        mammoth.extractRawText({path: file})
            .then(function(result){
                var text = result.value; // The raw text
                var messages = result.messages;
                text = text.replace(/(^[ \t]*\n)/gm, "").replace('\r', '').replace('\n', '');
                console.log('extractRawText',text);
                // concat the small content into big content
                data_collection = data_collection + " "+text;
            })
            .done();
      });
      resolve(data_collection);
    });
  });
}

我将如何解决问题?

1 个答案:

答案 0 :(得分:1)

_。map是同步的。它不等待巨大的承诺解决。 resolve(data_collection);行将在_.map之后且庞然大物承诺得到解决之前立即执行。这就是为什么data_collection为空的原因。

您可以使用类似的东西

var mammoth = require("mammoth");
var glob = require("glob");

function readAllFiles(dir){
  return new Promise((resolve, reject) => {
    glob(dir, (err, files) => {
      if(err) {
        return reject(err)
      }

      return Promise.all(files.map((file) => mammoth.extractRawText({ path: file })))
        .then((results) => {
          let data = ''
          results.forEach((result) => {
            const value = result.value.replace(/(^[ \t]*\n)/gm, "").replace('\r', '')
            data = data.concat(value)
          })
          resolve(data)
        })
        .catch(reject)
    })
  })
}

async function test() {
  const data = await readAllFiles('./test/**/*.docx') // All my docx files are in the test directory
  console.log(data) // Print data
}

test()

请注意,这将并行执行mammoth.extractRawText函数调用。如果您需要限制同时进行并行调用的次数,则可以使用async.mapLimit之类的东西。