1

我有一个 node.js / Polymer 1 网站。我正在使用 HTTP-proxy-middleware 将 api 调用 (/api/webapi) 路由到我的后端 API 服务器。

在其中一个页面上,我有一个将文件发送到 api 的 vaadin-upload (v2.3.0) 组件。在本地主机上运行时,一切似乎都正常,但是当我部署到我们的测试服务器时,我遇到了问题。上传要么快速完成,然后长时间处于“处理”状态,要么停止。

使用邮递员,我设法将文件直接发送到 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');
}
4

0 回答 0