У меня есть сайт 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');
}