【问题标题】:node js: request js multipart 2nd level file and JSON.stringify节点 js:请求 js 多部分二级文件和 JSON.stringify
【发布时间】:2016-04-18 05:34:00
【问题描述】:

我正在尝试将此 CURL 调用转换为 request.js

curl -i -X POST "https://api.soundcloud.com/tracks.json" \
            -F 'oauth_token=***' \
            -F 'track[asset_data]=@music.wav' \
            -F 'track[title]=Track title' \
            -F 'track[sharing]=public'

有趣的是文件附件('asset_data')位于 formData 对象的第二层。

这不起作用:

var formData = {
  oauth_token: '***',
  track: {
    asset_data: fs.createReadStream('music.wav'),
    title: 'Track title',
    sharing: 'public'
  }

}
request.post({url:'http://service.com/upload', formData: formData}...

我知道这是因为 the docsthis post 说我必须将 track 嵌入到 JSON.stringify(track)

但是当我这样做并执行 POST 时,它会返回 "buffer":[],"length":0,我觉得它没有等待文件流式传输,然后才对其进行字符串化。

所有代码都集中在一个地方:

function postToSoundcloud(){
    var track = {'sharing': 'public',
                 'title': TRACK_NAME,
                 'asset_data': fs.createReadStream('music.wav')
                }
    var formData = {
        oauth_token: '***',
        track: JSON.stringify(track)
    };
    var req = request.post({url:'https://api.soundcloud.com/tracks.json', 'formData': formData}, function optionalCallback(err, httpResponse, body) {
        if (err) {
            return console.error('upload failed:', err);
        }
        console.log('Upload successful!  Server responded with:', body);
    }); 
}

如果有更好的方法而不是使用 request.js,我愿意接受。我可以看出 request.js 很受欢迎,但我对 node 还是很陌生。

非常感谢大家

【问题讨论】:

  • 你希望你的 post 请求以同步方式?
  • @Sagar 是的,在这种情况下,事情是同步的

标签: javascript json node.js request requestjs


【解决方案1】:

你需要像 curl 一样格式化它:

var formData = {
  oauth_token: '***',
  'track[asset_data]': fs.createReadStream('music.wav'),
  'track[title]': 'Track title',
  'track[sharing]': 'public'
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-20
    • 1970-01-01
    • 2017-08-19
    • 1970-01-01
    • 1970-01-01
    • 2017-03-13
    • 2017-12-24
    • 1970-01-01
    相关资源
    最近更新 更多