[英]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上。 第一個可以看出這里和第二位置 。 有很大的差異。
現在我想知道兩件事:
編輯:下面回答的問題問題由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.