axiosjs отправляет FormData с узла - PullRequest
0 голосов
/ 25 февраля 2019

Я не могу заставить это работать правильно.API Flightaware требует, чтобы почтовый запрос был сделан с данными формы.Узел не поддерживает данные формы, поэтому я импортировал 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' }

1 Ответ

0 голосов
/ 25 февраля 2019

Только если кто-нибудь сталкивался с этим ...

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);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...