NodeJS 使用文件作为有效负载发出节点获取POST请求

nxowjjhe  于 12个月前  发布在  Node.js
关注(0)|答案(1)|浏览(97)

第一次海报,很高兴有一个社区在这里合作!
下面是我的情况:我使用Node为公司的合规性设置自动化-从MDM服务器获取报告并将其发布到合规性平台(拖船逻辑)。我们的想法是通过AWS Lambda定期部署它。基本逻辑是这样的:getToken获取一个auth令牌,然后将其传递给getReports。getReports循环遍历一个端点数组以从MDM获取报告,然后将这些报告沿着传递给fileReport- 然后将该数据发布到端点。
问题是最终端点需要一个文件作为有效负载(下面的POST请求示例)。我通过使用fs writeFile/readFile成功地让整个fetch链工作(和延迟),虽然这起了作用,但它并不能很好地转化为Lambda环境。理想情况下,我只想从getReports中获取有效负载(它以JSON的形式出现,但也可以作为文本接受),并将其直接推送到端点。任何关于如何清理此代码的帮助都将不胜感激!
这里的位给我最麻烦的(从最后一个文件)
第一个月

// Sample post request for final endpoint
curl -v --user <provided-username>:<given-password> \
 -H "X-API-KEY: <given-x-api-key>" \
 -F "collected=<date-of-evidence>" -F "file=@<local_filename_csv>;type=text/csv" \
 <given-collector-url>
//getReports.js accepts a token from an earlier function and takes fileReport as the cb
function getReports(token, cb) {
    const headers = {
        method: 'GET',
        headers: {
            'accept': 'application/json',
            'Authorization': `Bearer ${token}`
        },
        redirect: 'follow'
    }
    for (let i = 0; i < reportsArray.length; i++) {
        fetch(reportsArray[i].source, headers)
        .then(res => res.json())
        // writeFile leftover from successful deploy
        /*.then(data => fs.writeFile(`./reports/${reportsArray[i].name}.json`, data, function (err) {
            if (err) throw err;
        }))*/
        .then(res => cb(i, res))
        .catch(error => console.log('error', error))
}
};
//fileReport.js - i identifies the right endpoint from the imported array and sets filename. x is the JSON payload passed down from getReports
function fileReport(i, x) {
    const form = new FormData();
    form.append('collected', getTimestamp());
    form.append('file', x, `${reportsArray[i].name}.json`);
    fetch(`${reportsArray[i].dest}`, {
        method: 'POST',
        headers: {
            'X-API-KEY': `${process.env.TUGBOAT_X_API_KEY}`,
            'Authorization': 'Basic ' + btoa(`${process.env.TUGBOAT_USERNAME}:${process.env.TUGBOAT_PASSWORD}`)
        },
        body: form
    });
};
31moq8wy

31moq8wy1#

您没有正确地将文件传递到formData
下面的伪代码演示了如何工作:

const file = fs.createReadStream("/path/to/file");
const url = "https://your.com/upload";
const fields = {}; // additional fields
const formData = new FormData();
Object.entries({ ...fields, file }).forEach(([key, value]) => {
  formData.append(key, value);
});
// built-in node fetch()
fetch(url, {
  method: "POST",
  body: formData,
}).then((response) => {
  if (!response.ok) {
    throw new Error(`Upload failed ${response.statusText}`);
  }
  console.log("file uploaded");
});

字符串

奖励:

如果您需要在浏览器中执行此操作,则只需换出file以使用用户选择的文件。
我来告诉你。
而不是:

const file = fs.createReadStream("/path/to/file");


有一个这样的表单元素:

<input type="file" name="myFile" onChange={(e) => documentGetLocalFile(e)} />


还有一个这样的管理员

var file;
documentGetLocalFile(event) {
  if (event.target.files && event.target.files[0]) {
    file = event.target.files[0];
  }
}


然后确保你的formData使用这个file来代替你上面删除的fs.createReadStream()文件。

相关问题