处理强大的异步功能并在PDFReader中提取文本中的路由

问题描述 投票:2回答:1

我正在创建一个应用程序,用户可以在其中上传pdf并将文本提取为JSON格式。我可以访问文本,但是在PDF提取完成之前,我无法保留响应。我不熟悉“强大”,可能会完全缺少一些东西。

我正在使用Formidable进行上传,并使用PDFReader进行文本提取。前端和后端位于单独的服务器上,并且该应用程序仅适用于本地使用,因此这不成问题。我能够完美地console.log文本。我想以某种方式使用JSON格式的文本。我想将文本追加到响应的前端,但是在发送响应之前我似乎无法保留它。

const IncomingForm = require("formidable").IncomingForm;
const { PdfReader } = require('pdfreader');
const test = new PdfReader(this,1);

module.exports = function upload(req, res) {
  let str = ''
  let form = new IncomingForm();

  form.parse(req, () => {
    console.log('parse')
  });

  form.on("file", (field, file) => {
    test.parseFileItems(file.path, (err, item) => {
      if (err){
        console.log(err)
      }
      else if (item){
        if (item.text){
          console.log(item.text)
          str += item.text
        }
      }
    })
  });
  
  form.on("end", () => {
    console.log("reached end/str: ", str)
  });

};

我已经尝试了多种不同的方式来处理异步功能,主要是在form.on('file')中。以下对form.on('file')的尝试会产生相同的效果(正确地记录了console.log的文本,但仅在击中form.on('end“)之后:

//Making the callback to form.on('file') async then traditional await

    form.on("file", async (field, file) => {
    //...
    await test.parseFileItems(...)
    //...
    console.log(str) //After end of PDFReader code, shows blank

//Making cb async, then manually creating promise
  form.on("file", async (field, file) => {
  //...
  let textProm = await new Promise ((res, rej) => //...

我还尝试使用fs.readFile从Buffer手动转换文本,但这也会产生相同的效果;我只有在点击form.end后才能访问文本。

我看到的几件事是先单击form.on('file'),然后单击form.parse。似乎我正在尝试两次解析文档(Formidable和Pdfreader),但这可能是必要的。

而且,在阅读了docs / stackoverflow之后,我认为我将内置中间件与form.parse / form.on / form.end与手动回调混合在一起,但是我不确定如何只使用一个,但我仍然可以访问文本。

最后,PDFReader一次访问一行文本,因此每行都运行parseFileItems。我试图用PdfReader实例解析Promise.all,但无法正常工作。

任何帮助将不胜感激!

node.js express asynchronous formidable pdf-reader
1个回答
0
投票

您在这方面取得了进展吗?

© www.soinside.com 2019 - 2024. All rights reserved.