Я создаю приложение, в котором пользователи загружают 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, но не смог заставить его работать.
Любая помощь будет принята с благодарностью!