Node.js - 为请求创建表单与从request.post?

时间:2015-11-27 23:38:08

标签: javascript node.js facebook request form-data

今天我添加了将照片上传到Facebook的功能,以及我正在处理的网站。该站点是在Express node.js中构建的,我使用请求npm模块进行上传。

我不断收到错误消息:"(#324)需要上传文件"。我认为这与我尝试上传的照片文件有关,因此我尝试将其转换为base64,更改标题,手动创建POST请求等不同的变体。

我最终尝试了一个响应的完整代码,令我惊讶的是,即使图像数据来自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上。可以看到第一个here和第二个here。存在巨大差异。

现在我想知道两件事:

  1. 为什么要创建两个不同的表单数据?创建/附加它们的两种方法有什么区别?
  2. 如何通过方法1中的请求附加到表单中?邮政请求何时实际发生?我假设它在request.post(..)上执行,但随后我可以在发布之前将其添加到表单数据中。
  3. 编辑:下面回答的问题 问题由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);
            }
        }
    );
    

1 个答案:

答案 0 :(得分:0)

request documentation解释了差异。第一种形式用于提交application/x-www-form-urlencoded类型的请求,而第二种形式用于提交multipart/form-data类型的请求。

(二进制)文件通常无法与application/x-www-form-urlencoded次请求一起提交,因此通常会使用multipart/form-data(尽管某些网络服务可能允许您通过PUT请求提交单个文件其中请求的内容是原始文件内容。)

request()时不会立即发送HTTP请求,因为它是异步的,需要时间进行DNS查找,设置用于发出HTTP请求的TCP连接等等。你可以向表单添加更多字段的时间(假设request在说下事件循环的下一个滴答后不会人为地阻止你这样做),但最好将它们全部添加到一次只是为了安全。