我正在创建一个应用程序,用户可以在其中上传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,但无法正常工作。
任何帮助将不胜感激!
您在这方面取得了进展吗?