如何使用nodejs中的查询字符串参数代理请求,我目前正在使用express和http-proxy?
我有一个使用express和http-proxy模块的nodejs应用程序将HTTP GET请求从我的端点上的某些路径代理到在同一服务器上运行的第三方API但是具有不同的端口(因此遭受同一原因问题) ,需要代理)。这工作正常,直到我想在后端API上使用查询字符串参数调用REST函数,即"?name = value"。然后我得到了404。
var express = require('express');
var app = express();
var proxy = require('http-proxy');
var apiProxy = proxy.createProxyServer();
app.use("/backend", function(req,res){
apiProxy.web(req,res, {target: 'http://'+ myip + ':' + backendPort + '/RestApi?' + name + '=' + value});
});
Chrome控制台显示:
"GET http://localhost:8080/backend 404 (Not Found)"
注意:我稍后会在快递中使用其他内容,但不会在代理行之前使用其他内容,而是在路由路径时从更具体到更通用。可以使用相同的协议在浏览器中直接访问后端:// url:port / path?name = value没有问题。
答案 0 :(得分:5)
我通过更改req.url
以包含查询字符串参数并将主机名仅传递给apiProxy.web
target
参数来实现此目的:
app.use('/*', function(req, res) {
var proxiedUrl = req.baseUrl;
var url = require('url');
var url_parts = url.parse(req.url, true);
if (url_parts.search !== null) {
proxiedUrl += url_parts.search;
}
req.url = proxiedUrl;
apiProxy.web(req, res, {
target: app.host
});
});
答案 1 :(得分:4)
代理请求参数和查询字符串,传递Express v4 originalUrl
属性:
app.use('/api', function(req, res) {
req.url = req.originalUrl //<-- Just this!
apiProxy.web(req, res, {
target: {
host: 'localhost',
port: 8080
}
})
答案 2 :(得分:0)
使用以下命令将查询字符串参数附加到req.url
app.use('/api', function(req, res) {
var qs = require("qs");
req.url = qs.stringify(req.query, {
addQueryPrefix: true
});
apiProxy.web(req, res, {
target: {
host: 'localhost',
port: 8080
}
})
答案 3 :(得分:0)
这对我来说真是浪费时间-(杀死进程并重新启动)
然后我开始使用 kill-port ,我再也没有收到错误消息
const express = require('express'),
app = express(),
bodyParser = require('body-parser'),
kill = require('kill-port'),
port = 5000;
const main = (req,res,app) => {
// now you can start listening
app.listen(port, function () {
console.log('Server is running on port: ' + port);
});
// do stuff....
}
app.get("/myrest", (req, res) => {
kill(port, 'tcp')
.then(main(req,res,app))
.catch(console.log);
});