[英]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/
req.on
不返回 promise你需要:
getDataFromReq
中的await
getDataFromReq
的声明中去掉async
(除非你在其中使用await
,否则它是没有意义的)getDataFromReq
显式返回一个new Promise
req.on('end', ...
)。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.