簡體   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