node.js - 如何在 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 });
}
解决方案
你是如此接近,我想做类似的事情并将代理包装在一个承诺中,这样我们就可以等待代理返回,然后再响应我们的响应:
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;
我想我会给遇到这个问题的其他人一个完整的答案。
推荐阅读
- c# - Best way to make a WPF application that will later become a library for a AutoCAD .net program
- java - Java多线程同步问题
- python - 如何使用 python 3.x 从远程 url 打印 csv 内容?
- java - How to access for loop variables outside for loop?
- here-api - HERE Transit APi (modes)
- visual-studio-code - 显示快速建议,但不要自动插入
- php - 重定向到链接然后重定向到codeigniter中的主网站?
- mysql - MySQL 多左连接限制
- mysql - 如何理解不使用 INNER JOIN 将表连接到自身的 SQL SYNTAN?
- php - 矩阵和数组