首页 > 解决方案 > 如何在 AdonisJS 控制器中使用 node-http-proxy

问题描述

我正在尝试在 AdonisJS 控制器中使用 node-http-proxy,但出现错误

The "url" argument must be of type string. Received type function

导致错误的行是proxy.web(request, response, { target: urlToProxy });

async proxy({ request, response }){
    var resource = await Resource.query().where('uri', request.url()).with('service.user').with('userSecurity').first()
    resource = resource.toJSON()
    if(!resource.service.active){
      return response.status(404).send(`Parent service '${resource.service.title}' is disabled`)
    }
    if(!resource.active){
      return response.status(404).send(`Resource is disabled`)
    }
    if(resource.userSecurity.length <= 0) {
      return response.status(403).send(`You are not permitted to access that resource. Contact ${resource.service.user.first_name} ${resource.service.user.last_name} (${resource.service.user.email})`)
    }

    var urlToProxy = url.resolve(resource.service.basepath, request.originalUrl())
    var proxy = httpProxy.createProxyServer()

    proxy.web(request, response, { target: urlToProxy });

  }

标签: node.jsnode-http-proxyadonis.js

解决方案


你是如此接近,我想做类似的事情并将代理包装在一个承诺中,这样我们就可以等待代理返回,然后再响应我们的响应:

const proxy = httpProxy.createProxyServer();
const prom = new Promise((resolve, reject) => {
    proxy.web(request.request, response.response, {
        target: urlToTarget
    }, (e) => {
        reject(e);
    });

    proxy.on('proxyRes', function (proxyRes, req, res) {
        let body = [];
        proxyRes.on('data', function (chunk) {
            body.push(chunk);
        });
        proxyRes.on('end', function () {
            body = Buffer.concat(body).toString();
            resolve(body);
        });
    });
});

const result = await prom;
response.body(result);
return response;

我想我会给遇到这个问题的其他人一个完整的答案。


推荐阅读