Vaadin-Upload не работает с http-proxy-middleware - PullRequest
1 голос
/ 05 марта 2019

У меня есть сайт node.js / Polymer 1. Я использую промежуточное ПО HTTP-прокси для маршрутизации вызовов API (/ api / webapi) на свой серверный сервер API.

На одной из страниц у меня есть компонент vaadin-upload (v2.3.0), который отправляет файлы в API. Кажется, что все работает нормально при работе на локальном хосте, но при развертывании на наших тестовых серверах у меня возникают проблемы. Либо загрузка завершается быстро, а затем «обрабатывается» в течение длительного времени или она останавливается.

С помощью почтальона мне удалось отправить файл напрямую в API, на прокси-сервер. Мне также удалось получить компонент загрузки для прямого вызова API. Все эти случаи работают правильно, и выходные данные из API позволяют предположить, что во всех случаях API получает / обрабатывает данные с одинаковой скоростью. Исходя из этого, я ограничился взаимодействием между Vaadin-Upload и http-proxy-middleware.

Кто-нибудь имеет опыт с этим и поможет мне правильно настроить прокси.

Конфигурация прокси:

const url = require('url');
var hpmproxy = require('http-proxy-middleware');
var config = require('../config');

// Adds user authorization token from passport to request
var addAuthTokenMiddleware = function (req, res, next) {

    if (req.session && req.isAuthenticated()) {
        req.headers['authorization'] = 'Bearer ' + req.user.token;
        next();
    } else {
        req.abort();
    }
};


function isLoggedIn(req, res, next) {
    // if user is authenticated in the session, carry on
    if (req.session && req.isAuthenticated())
        return next();

    res.status(403).end();
};

function restream(proxyReq, req) {
    if (isMultipartRequest(req))
        console.log('Multipart');
    if (!isEmpty(req.body)) {
        console.log("parse");
        var bodyData = JSON.stringify(req.body);
        proxyReq.setHeader('Content-Type', 'application/json');
        proxyReq.setHeader('Content-Length', Buffer.byteLength(bodyData));
        proxyReq.write(bodyData);
    }
    console.log("-->[proxyReq]----", proxyReq.path, proxyReq.getHeader('Content-Type'));

};

function handleResponse(proxyRes, req, res) {
  console.log('---[proxyRes]<---', proxyRes.req.method, proxyRes.req.path, proxyRes.statusCode);
};

function isMultipartRequest(req) {
  let contentTypeHeader = req.headers['content-type'];
  return contentTypeHeader && contentTypeHeader.indexOf('multipart') > -1;
};

function isEmpty(obj) {
    for(var prop in obj) {
        if(obj.hasOwnProperty(prop))
            return false;
    }
    return JSON.stringify(obj) === JSON.stringify({});
}
var options = {
    target: config.webApiHost,

    changeOrigin: true, // needed for virtual hosted sites
    pathRewrite: {
        '^/api/webapi/': config.webApiPath
    },
    secure: !config.selfSigned,
    onProxyRes: handleResponse,
    onProxyReq: restream
   // ,logLevel: 'debug'


};

var hpmApiProxy = hpmproxy(options);

module.exports = function (app, passport, config) {
    app.use('/api/webapi/', isLoggedIn, addAuthTokenMiddleware, hpmApiProxy);
    console.log(' WebAPI Proxy Loaded');
}
...