Nodejs 缺少来自 HTTP 请求的数据

Nodejs Missing Data From HTTP Request

我目前正在尝试从 HTTP 请求中获取文件,然后将数据写入文件(在本例中为 PDF)。

使用以下方法我可以生成有效的 PDF,但我发送的文件有几行,但我创建的文件是空白的。

我用来尝试获取数据的函数:

async function getDataFromReq(req){
    let body = '';
    await req.on('data', (chunk) => {
        body += chunk;
    });
    return body;
}

我对该函数的实现并将其写入文件:

let file = await getDataFromReq(req);
await writeFile(fileName,file);

我的写入文件功能:

async function writeFile(fileName,file){
    fs.writeFileSync('./'+fileName, file);
}

注:

我能够使用 King Friday 的解决方案,但我采纳了 Quentins 的建议并使用现有的库来完成任务,而不是重新发明轮子。我按照本指南使用了 multer - https://bezkoder.com/node-js-express-file-upload/

  • 你只能等待一个承诺
  • req.on 没有 return 承诺

您需要:

  1. 去掉getDataFromReq里面的await
  2. getDataFromReq的声明中去掉async(除非你在其中使用await,否则没有意义)
  3. 明确地 return 来自 getDataFromReq
  4. new Promise
  5. 为传入数据完成传入时注册一个处理程序 (req.on('end', ...)。
  6. resolve 处理程序中的承诺

但是,不重新发明轮子可能会更容易。 reading files and making HTTP requests.

已经有基于承诺的模块

像这样

const { promises as fs } = require('fs');

function getDataFromReq(req) {
  return new Promise((resolve, reject) => {
    let body = '';
    req.on('data', chunk => {
      body += chunk;
    });
    req.on('end', () => {
      resolve(body);
    });
    req.on('error', err => {
      reject(err);
    });
  });
});

然后你可以像这样在异步方法中使用...

const body = await getDataFromReq(req);
await fs.writeFile(fileName, body);