Увеличение maxContentLength и maxBodyLength в Axios - PullRequest
0 голосов
/ 01 ноября 2019

Я использую «Axios» для вызова метода WCF, который принимает в качестве информации и содержимого файла параметров. Файл читается и отправляется в виде строки в кодировке base64. Моя проблема заключается в том, что, когда размер файла превышает определенный предел, AXIOS выдает исключение: «Ошибка: тело запроса превышает ограничение maxBodyLength». Я посмотрел на проблему и обнаружил, что все решения предлагают увеличить параметры maxContentLength / maxBodyLength в объекте конфигурации AXIOS, но безуспешно. Найти Ниже внедренный тестовый пример в файле node.js:

    var axios = require('axios');
    var fs = require('fs');
    var path = require('path')
    enter code here`var util = require('util')
    let readfile = util.promisify(fs.readFile)

    async function sendData(url,data) {
        let params = data

        let resp = await axios({
            method: 'post',
            url: url,
            data: JSON.stringify(params),
            headers: { 'Accept': 'application/json', 'Content-Type': 'application/json' }
            // maxContentLength: 100000000,
            // maxBodyLength: 1000000000
        }).catch(err => {
            throw err;
        })
        return resp;
      }
    async function ReadFile(filepath) {
        try{

            let res = await readfile(filepath,'base64')
            let filename = path.basename(filepath).split('.').slice(0, -1).join('.')
            let ext = path.extname(filepath)

            return {data:res,fext:ext,fname:filename}
            let x = 1
        }
        catch(err)
        {
            throw err
        }

    }
    (async () => {
        try {

            let img = await ReadFile('Files/1.pdf')
            let res = await sendData('http://183.183.183.242/EMREngineEA/EMRWS.svc/web/EMR_TestUploadImg',img)
            console.log(res)

        }
        catch (ex) {
            console.log(ex)
        }
    }
    )();

В моем случае размер файла PDF составляет 20 МБ, при запуске выдается ошибка. «Ошибка: тело запроса превышает предел maxBodyLength»

Я пытался установить maxContentLength: 100000000, maxBodyLength: 1000000000, как показано выше, но не удалось.

Ваша помощь приветствуется.

1 Ответ

1 голос
/ 01 ноября 2019

Мне кажется, что maxBodyLength работает в этом простом тесте, я загружаю данные на локальный сервер Express. Если я пытаюсь загрузить больше, чем maxBodyLength, я получаю ту же ошибку, что и вы. Так что я подозреваю, что в вашем случае происходит нечто большее, например, перенаправление, которое вызывает ошибку.

Существует проблема, регистрируемая для axios здесь , которая, кажется, ссылается на проблему, предлагает установить maxContentLengthв бесконечность (как предлагает другой комментатор).

например

maxContentLength: Infinity,
maxBodyLength: Infinity

Тестовый код ниже:

const axios = require("axios");

function generateRandomData(size) {
    const a = Array.from({length: size}, (v, k) => Math.floor(Math.random()*100)); 
    return { data: a, id: 1 };
}

async function uploadData(url, size) {
    let params = generateRandomData(size);
    let stringData = JSON.stringify(params);
    console.log(`uploadData: Uploading ${stringData.length} byte(s)..`);
    let resp = await axios({
        method: 'post',
        url: url,
        data: stringData,
        headers: { 'Accept': 'application/json', 'Content-Type': 'application/json' },
        maxContentLength: 100000000,
        maxBodyLength: 1000000000
    }).catch(err => {
        throw err;
    })
    console.log("uploadData: response:", resp.data);
    return resp;
}

uploadData("http://localhost:8080/upload", 10000000);

Соответствующий код сервера:

const express = require("express");
const port = 8080;
const app = express();
const bodyParser = require('body-parser')

app.use(bodyParser.json({limit: '50mb'}));

app.post('/upload', (req, res, next) => {
    console.log("/upload: Received data: body length: ", req.headers['content-length']);
    res.json( { status: 'ok', bytesReceived: req.headers['content-length']});
})

app.listen(port);
console.log(`Serving at http://localhost:${port}`);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...