繁体   English   中英

Nodejs 缺少来自 HTTP 请求的数据

[英]Nodejs Missing Data From HTTP Request

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

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

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

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

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

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

我写的文件function:

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

笔记:

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

  • 您只能等待 promise
  • req.on不返回 promise

你需要:

  1. 摆脱getDataFromReq中的await
  2. getDataFromReq的声明中去掉async (除非你在其中使用await ,否则它是没有意义的)
  3. getDataFromReq显式返回一个new Promise
  4. 注册一个处理程序,用于处理传入数据何时完成传入 ( req.on('end', ... )。
  5. resolve该处理程序内的 promise

但是,不重新发明轮子可能会更容易。 已经有基于 promise 的模块用于读取文件发出 HTTP 请求

像这样

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

添加到 King Friday 上面的回答中,帮助我从 HTTP 请求中获取 pdf 文件的是在event 'data'中添加此行:

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

之前,我是将请求信息收集在一个数组中,并将最后的body function 转换为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 object 并将每个值添加到body数组。 最后, end function 我将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);
    });
  });
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM