javascript - axios js从 Node 发送表单数据

标签 javascript node.js typescript axios

我似乎无法让它正常工作。 Flightaware 的 api 要求使用表单数据发出 post 请求。 Node 不支持表单数据,因此我从 https://www.npmjs.com/package/form-data 导入了 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);
});

关于javascript - axios js从 Node 发送表单数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54859767/

相关文章:

node.js - 如何获取 strip 订阅 current_period_end 作为日期

javascript - Node JS 将用户输入保存到文本文件中

javascript - TypeScript 中的接口(interface)和类

reactjs - 如何在 Typescript 中将 ref prop 和 useRef 与 Lottie 文件一起使用?

javascript - 警告 [网络服务器] : 404:/base/public/js/dest/dest. js

javascript - 绘制圆圈,然后使用 html canvas 和 javascript 移动它

javascript - Node.js 中的阻塞 IO

javascript - 为什么 TypeScript 在使用 .includes 搜索数组中的字符串时会抛出错误?

Javascript:同步执行

javascript - 正则表达式提取登录用户名