Обработка асинхронных функций и маршрутизация в грозных / извлечение текста в PDFReader - PullRequest
1 голос
/ 17 мая 2019

Я создаю приложение, в котором пользователи загружают PDF и извлекают текст в формате JSON.Я могу получить доступ к тексту, но не могу удержать ответ до завершения извлечения PDF.Я не знаком с Formidable и, возможно, что-то упустил полностью.

Я использую Formidable для загрузки и PDFReader для извлечения текста.Внешний и внутренний интерфейсы находятся на отдельных серверах, и приложение предназначено только для локального использования, поэтому проблем не должно быть.Я могу утешить текст журнала отлично.Я хотел бы работать с текстом в формате 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.logged, но только после нажатия на 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, но это также дает тот же эффект;Я могу получить доступ к тексту только после нажатия form.end.

Несколько вещей, которые я вижу, это то, что сначала вызывается form.on ('file'), а затем form.parse.Возможно, я пытаюсь разобрать документ дважды (Formidable и Pdfreader), но это, вероятно, необходимо.

Кроме того, после чтения потока документов / stackoverflow, я думаю, что я смешиваю встроенныйпромежуточное программное обеспечение с form.parse / form.on / form.end с ручными обратными вызовами, но я не был уверен, как придерживаться только одного, и я все еще могу получить доступ к тексту.

Наконец, PDFReader обращается ктекст по одной строке за раз, поэтому parseFileItems запускается для каждой строки.Я попытался разрешить Promise.all с помощью экземпляра PdfReader, но не смог заставить его работать.

Любая помощь будет принята с благодарностью!

...