javascript - axiosjs 从节点发送 FormData
问题描述
我似乎无法正常工作。Flightaware 的 api 要求使用表单数据进行发布请求。Node 不支持表单数据,所以我form-data
从https://www.npmjs.com/package/form-data导入。然后使用 axios,我的代码是这样的。
import { FlightAwareNotification, FlightAwareCredentials } from './models/flightaware';
import { Trip, MilestoneTypes } from './models/trips.model';
import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin'
import axios from 'axios';
import * as FormData from 'form-data';
admin.initializeApp();
const urls = {
inFlightInfo: FlightAwareCredentials.url + 'InFlightInfo',
mapFlight: FlightAwareCredentials.url + 'MapFlight',
setAlert: FlightAwareCredentials.url + 'SetAlert',
}
const AUTH_ENCODED = Buffer.from(`${FlightAwareCredentials.user}:${FlightAwareCredentials.password}`).toString('base64');
export const setFlightAwareAlert = functions.https.onRequest(async (request, response) => {
const body: {[key: string]: any} = request.body;
const data = new FormData();
Object.keys(body).forEach(key => data.append(key, body[key]));
let alert_id;
try {
alert_id = await axios({
url: urls.setAlert,
method: 'post',
data: data,
headers: {
'Content-Type': 'application/json',
'Authorization': `Basic ${AUTH_ENCODED}`,
},
withCredentials: true,
});
} catch(err) {
console.log(err)
}
response.json(alert_id && alert_id.data);
});
当我发送请求时,响应是"error": "MISSING: no {channels} specified"
这表明它没有正确获取表单数据。
所以我尝试了控制台记录数据,它看起来像这样......
info: FormData {
_overheadLength: 639,
_valueLength: 97,
_valuesToMeasure: [],
writable: false,
readable: true,
dataSize: 0,
maxDataSize: 2097152,
pauseStreams: true,
_released: false,
_streams:
[ '----------------------------992898597909585809439236\r\nContent-Disposition: form-data; name="alert_id"\r\n\r\n', '0',
[Function: bound ],
'----------------------------992898597909585809439236\r\nContent-Disposition: form-data; name="channels"\r\n\r\n', '{16 e_filed e_departure e_arrival e_diverted e_cancelled}',
[Function: bound ],
'----------------------------992898597909585809439236\r\nContent-Disposition: form-data; name="date_end"\r\n\r\n', '1551056400000',
[Function: bound ],
'----------------------------992898597909585809439236\r\nContent-Disposition: form-data; name="date_start"\r\n\r\n', '1551056400000',
[Function: bound ],
'----------------------------992898597909585809439236\r\nContent-Disposition: form-data; name="ident"\r\n\r\n', 'DAL123456',
[Function: bound ],
'----------------------------992898597909585809439236\r\nContent-Disposition: form-data; name="origin"\r\n\r\n', 'KDTW',
[Function: bound ] ],
_currentStream: null,
_boundary: '--------------------------992898597909585809439236' }
解决方案
以防万一有人遇到这个...
export const setFlightAwareAlert = functions.https.onRequest(async (request, response) => {
const body: {[key: string]: any} = request.body;
const data = new FormData();
Object.keys(body).forEach(key => data.append(key, body[key]));
let alert_id;
try {
alert_id = await axios.post(urls.setAlert, data, {
headers: {
'Content-Type': 'application/json',
'Authorization': `Basic ${AUTH_ENCODED}`,
...data.getHeaders()
},
withCredentials: true
})
} catch(err) {
console.log(err)
}
response.json(alert_id && alert_id.data);
});
推荐阅读
- django - * NOT NULL 约束处的 IntegrityError 失败:main_post.owner_id
- go - chromedp clear 不适用于按查询选择
- google-apps-script - 如何在我信任的另一个用户的上下文中从我的帐户运行 google 应用程序脚本?
- powerbi - 将机器人 3T 与 PowerBI 连接
- python - 为什么 unittest 不将 numpy 数组视为序列?
- android - 想要为 Android TV 创建自定义视图
- javascript - 在 onChange 事件上模糊材质 UI 选择组件
- python - Edit marker shape in python
- sql - 如何从 SQL 查询的第 n 行设置变量
- c# - 使用公式和格式复制行,然后在 excel C# 中插入新行