[英]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.