我正在尝试将一些数据从node.js AWS lambda发布到sensiolabs安全api。 sensiolabs站点上的唯一文档记录了curl命令如何执行此操作。它将通话记录为
curl -H "Accept: text/plain" https://security.sensiolabs.org/check_lock -F lock=@/path/to/composer.lock
。
我正在尝试从其中有composer.json的AWS lambda执行此操作,该文件位于S3存储桶中。我可以读取存储桶并以字符串形式获取文件的内容,但是我无法弄清楚如何正确创建node.js请求对象来模仿上述curl命令。这是我最近的尝试:
exports.check_lockfile = function(data) {
var Readable = require('stream').Readable;
var s = new Readable;
s.push(data); // the string you want
s.push(null); // indicates end-of-file basically - the end of the stream
var promise = new Promise(
function(resolve, reject) {
var request = require('request');
var url = 'https://security.sensiolabs.org/check_lock';
var req = request.post({
headers: {
"Accept": "text/plain"
},
url: url
}, function(err, resp, body) {
if (err) {
console.log('Error!');
reject();
} else {
console.log(resp.statusCode);
console.log('body is ' + body);
console.log(JSON.stringify(resp));
resolve();
}
});
var form = req.form();
form.append('lock', s);
});
return promise;
};
但是我无论尝试什么,都会收到格式错误的请求或错误的请求{"error": "no lock}
。
答案 0 :(得分:1)
curl -F等效于使用multipart / form-data上传文件。
我修改了代码并运行它,得到了以下回报: 200 正文是安全报告
代码如下:
var fs = require('fs');
var request = require('request');
var url = 'https://security.sensiolabs.org/check_lock';
var formData = {lock: fs.createReadStream(__dirname + '/composer.lock')};
var req = request.post(
{
headers: {
"Accept": "text/plain",
"Content-Type": "multipart/form-data"
},
url: url,
formData: formData
}, function(err, resp, body)
{
if (err) {
console.log('Error!');
} else {
console.log(resp.statusCode);
console.log('body is ' + body);
console.log(JSON.stringify(resp));
}
}
);
注意:您可能需要更新“ composer.lock”文件的路径,在我的测试中,我将其放置在包含js文件的同一文件夹中。