簡體   English   中英

Node.js-為請求創建表單與從request.post獲取表單之間的區別?

[英]Node.js - difference between creating a form for a request versus getting it from request.post?

今天,我添加了將照片上傳到Facebook到我正在工作的網站的功能。 該網站內置於Express node.js中,我正在使用請求npm模塊進行上傳。

我一直收到錯誤消息:“(#324)需要上傳文件”。 我以為這與我要上傳的照片文件有關,因此我嘗試了將其轉換為base64,更改標題,手動創建POST請求等的各種變體。

我最終嘗試了一個響應的整個代碼,但令我驚訝的是,即使圖像數據只是來自我嘗試過多次的fs.createReadStream(req.file.path) ,它fs.createReadStream(req.file.path)

我發現區別在於我將表單數據添加到請求中的方式。 最初,我是內聯定義的:

request({
        url: 'https://graph.facebook.com/me/photos?access_token=' + req.user.facebook.token,
        method: "POST",
        form: {
            source: fs.createReadStream(req.file.path),
            message: req.body.message
        }
    }, function(error, response, body) {
        var bodyJSON = JSON.parse(body);
        if(bodyJSON.error) {
            console.log(bodyJSON.error.message);
        }
    });

這一直給我我前面提到的錯誤。 我發現的代碼看起來有些不同。

serverRequest = request.post('https://graph.facebook.com/me/photos?access_token=' + req.user.facebook.token, function(err, res, body) {
    var bodyJSON = JSON.parse(body);
    if(bodyJSON.error) {
            console.log(bodyJSON.error.message);
    }
});

form = serverRequest.form()
// append a normal literal text field ...
form.append('message', req.body.message);

// append a file field by streaming a file from disk ...
form.append('source', fs.createReadStream(req.file.path));

這可行。 因此,我決定比較兩個不同的表單對象。 它們很大,所以我將它們放在Pastebin上。 第一個可以看出這里和第二位置 有很大的差異。

現在我想知道兩件事:

  1. 為什么要創建兩個不同的表單數據? 兩種創建/附加方法的區別是什么?
  2. 從方法1中的請求追加到表單的工作方式是什么? 郵寄請求何時真正發生? 我以為它是在request.post(..)上執行的,但是隨后我可以在表單數據附加內容之前將其追加。

編輯:下面回答的問題問題由mscdex回答。 如果其他人需要它,這是我現在用於請求的代碼。

request.post(
    {
        url: 'https://graph.facebook.com/me/photos?access_token=' + authToken, 
        formData: {
            message: message,
            source: fs.createReadStream(imageFile.path) 
        }
    }, function(err, res, body) {
        var bodyJSON = JSON.parse(body);
        if(bodyJSON.error) {
            console.log(bodyJSON.error.message);
        }
    }
);

request文檔說明了區別。 第一種形式用於提交application/x-www-form-urlencoded類型的請求,第二種形式用於提交multipart/form-data類型的請求。

(二進制)文件通常不能與application/x-www-form-urlencoded請求一起提交,因此通常改用multipart/form-data (盡管某些Web服務可能允許您通過PUT請求提交單個文件,其中內容的請求是原始文件的內容)。

HTTP請求不會在request()時立即發送,因為它是異步的,並且需要時間進行DNS查找,建立用於發出HTTP請求的TCP連接等,因此在此期間,您可以附加更多字段(假設request不會在事件循環的下一個滴答聲之后人為地阻止您這樣做),但是為了安全起見,最好一次添加所有字段。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM