如何使用 node.js 使用 aws Lambda post 文件

How to post file using aws Lambda using node.js

我需要读取 s3 文件并将其发送给第三方 api 使用 Node.js V12 Labmda。

我可以从存储桶中读取 s3 文件。 但是我在使用 https 请求或 post 方法将该文件上传到第三方 url 时遇到问题。试了好几种方法都没成功

这是我的 lambda 示例代码。您能否查看并指导我如何解决此问题。

const AWS = require('aws-sdk');
const http = require('https');
const querystring = require('querystring');

exports.handler = async function(event, context, callback) {
    const params = {
        Bucket: "bucket",
        Key: "filename"
    };
    var content = await s3.getObject(params).promise();
    await uploadFile("url", callback, content);
};

const uploadFile = async (url, callback, content) => {
    return new Promise((resolve, reject) => {

        var requestData = {};
        requestData['file'] = content;

        const postData = querystring.stringify(requestData);

        const options = {
            hostname: 'xxx.xxx',
            path: url,
            method: 'POST',
            headers: {
                'Content-Type': "multipart/form-data",
                'Content-Length': Buffer.byteLength(postData)
            }
        };

        const req = http.request(options, (res) => {

            res.on('data', (chunk) => {
                //do something
            });
            res.on('end', () => {
                // do something
            });
        })
        req.write(postData);
        req.end();

    });
}

我可以看到一个带有 requests 模块的示例,也许它可以帮助:

const AWS = require('aws-sdk');
const http = require('https');
const querystring = require('querystring');
let request = require('request')

exports.handler = async function(event, context, callback) {
    const params = {
        Bucket: "bucket",
        Key: "filename"
    };
    let readStream = s3.getObject(params).createReadStream()
    await uploadFile("url", callback, readStream);
};

const uploadFile = async (url, callback, readStream) => {
    return new Promise((resolve, reject) => {

        var requestData = {};

        const postData = querystring.stringify(requestData);
        
        let formData = {
          applicationType: 'my_app_type',
          applicationName: 'my_app_name',
          upload: {
            value: readStream,
            options: {
              filename: 'my_file_name.zip', // adjust accordingly
              contentType: 'application/zip' // adjust accordingly
              knownLength: Buffer.byteLength(postData) // this is important
            }
          }
        }
        
        request.post({
          url: 'your_url',
          formData: formData
        }, function (error, response, body) {
          if (error) throw error
          console.log(body)
        });

    });
}

所以,我有点将您的代码段与 this 示例合并,其中 OP 尝试 PUT 内容而不是 POSTing 它。

请注意,但是,上面的代码未经测试。