我试图将此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 docs和this 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非常受欢迎,但我对节点也很新。
非常感谢你
答案 0 :(得分:1)
你需要像卷曲一样格式化它:
var formData = {
oauth_token: '***',
'track[asset_data]': fs.createReadStream('music.wav'),
'track[title]': 'Track title',
'track[sharing]': 'public'
}