【发布时间】:2018-12-26 23:30:56
【问题描述】:
我正在使用API to upload a CSV file。我从一个字符串在内存中创建 CSV 文件并使用request 模块上传它。但是,我无法从字符串创建可读流。我在How to create streams from string in Node.Js 上关注了一个 SO 答案。这是我的解决方案代码:
var importResponse = function(csv, callback){
stringify(csv, function(err, output){
const s = new Readable();
s._read = () => {};
s.push(output);
s.push(null);
request.post({
headers: {'X-API-TOKEN':token, 'content-type' : 'multipart/form-data'},
url: 'https://ca1.qualtrics.com/API/v3/responseimports',
formData: {
surveyId: 'SV_123',
file: {
value: s,
options: {
contentType: 'text/csv; charset=utf-8'
}
}
}
}, function(err, res, body){
if(err || res.statusCode !== 200){
console.log(err || "Error status code: " + res.statusCode);
console.log(body);
return;
}
});
});
}
csv 变量看起来像 [["QID1","QID2"],["1","2"]],而 stringify 的输出看起来像 "QID1,QID2\n,1,2\n"。
这个解决方案给了我错误Unexpected end of input
{"meta":{"httpStatus":"400 - Bad Request","error":{"errorMessage":"Unexpected end of input"}}}
如果我改用memfs,它可以正常工作
const fs = require('memfs');
var importResponse = function(csv, callback){
stringify(csv, function(err, output){
// Create file in memory
fs.writeFileSync('/data.csv', output);
request.post({
headers: {'X-API-TOKEN':token, 'content-type' : 'multipart/form-data'},
url: 'https://ca1.qualtrics.com/API/v3/responseimports',
formData: {
surveyId: 'SV_123',
file: {
value: fs.createReadStream('/data.csv'),
options: {
contentType: 'text/csv; charset=utf-8'
}
}
}
}, function(err, res, body){
if(err || res.statusCode !== 200){
console.log(err || "Error status code: " + res.statusCode);
console.log(body);
return;
}
});
});
}
如何将stringify 的输出转换为可用于通过 api 上传的 Stream?
【问题讨论】:
-
我们肯定知道,
stringify来自哪里?您有需要的特定软件包吗? -
看起来
csv-stringify可以自己创建流,仅供参考。您可以直接将stringify(csv)作为“文件”流传递。 -
@Jacob 是的,这解决了它。将我的代码更改为
var output = stringify(csv);,现在可以使用了。还将字符串化模块更改为同步模块。谢谢!
标签: javascript node.js