NodeJS 节点js缺少HTTP请求中的数据

ryoqjall  于 2022-12-12  发布在  Node.js
关注(0)|答案(3)|浏览(178)

我目前正在尝试从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的建议,使用现有的库来完成任务,而不是重新发明轮子。

myzjeezk

myzjeezk1#

∮就像这样∮

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);
nbewdwxp

nbewdwxp2#

  • 你只能等待一个承诺
  • req.on未返回承诺

您需要:
1.去掉getDataFromReq中的await
1.从getDataFromReq的声明中去掉async(除非在里面使用await,否则这是没有意义的)
1.从getDataFromReq显式返回new Promise
1.注册一个处理程序,以便在传入数据完成传入时使用(req.on('end', ...)。

  1. resolve该处理程序中的承诺
    然而,不重新发明轮子可能会更容易。已经有基于承诺的reading filesmaking HTTP requests模块。
xkrw2x1b

xkrw2x1b3#

除了上面King Friday的回答之外,帮助我从HTTP请求中获取pdf文件的是在event'data'中添加了以下行:

body += Buffer.from(chunk).toString('base64');

之前,我将请求信息收集到数组中,并将函数结束部分的主体转换为base64字符串。结果是相同的,一个空白pdf。但是,将其转换为字符串,并连接数据块,同时将每个数据块转换为base64字符串解决了这个问题。完整的代码示例:

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

**更新:**我之前记录的解决方案只适用于单页的PDF。为了解决这个问题,我将body改为array,并在data回调中,遍历buffer对象并将每个值添加到body数组。最后,在end函数中,我将buffer数组转换为base64字符串。

function getPdfFromRequest(req) {
  return new Promise((resolve, reject) => {
    const body = [];
    req.on('data', chunk => {
      chunk.forEach((data) => body.push(data));
    });
    req.on('end', () => {
      resolve(Buffer.from(body).toString('base64'));
    });
    req.on('error', err => {
      reject(err);
    });
  });
});

相关问题