我如何在node.js请求中模拟curl -F选项

时间:2018-08-02 20:59:37

标签: node.js aws-lambda

我正在尝试将一些数据从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}

1 个答案:

答案 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文件的同一文件夹中。

下面是使用node命令运行以上代码后的屏幕截图: enter image description here