如何将请求转发到node.js中的其他端点

时间:2015-08-21 13:00:21

标签: node.js

在我的场景中,我需要向另一个终点转发请求。在我的机器上有两个服务器php和node.js服务器。 Node.js就像一个“中间人”,PHP服务器必须以同样的方式工作。

Node.js服务器代码

var express = require('express');
var fs = require('fs');
var path = require('path');
var http = require('http');
var https = require('https');
var app = express();

var HTTP_PORT = 3000;

// Create an HTTP service
http.createServer(app).listen(HTTP_PORT,function() {
  console.log('Listening HTTP on port ' + HTTP_PORT);
});


//endpoint for tracking
app.get('/track', function(req, res) {

  sendRequestToOtherEndPoint(req);

  processRequest(req);
  res.setHeader('Content-Type', 'application/json');
  res.send('Req OK');
});

function processRequest(req){
    console.log("request processed");
}

function sendRequestToOtherEndPoint(req){
    //magic here :)
}

当此服务器在端口3000中收到get请求时,它会处理请求信息,并且必须将相同的请求转发到另一个端点。

例如:

  1. 获取localhost:3000 / track?param1 = 1& param2 = 2
  2. 服务器进程获取请求
  3. 服务器转发请求到localhost / final-endpoint?param1 = 1& param2 = 2

3 个答案:

答案 0 :(得分:11)

根据您尝试执行的操作,您可以为终点创建新请求:

//endpoint for tracking
app.get('/track', function(req, res) {

  req.get({url: 'http://end-point', headers: req.headers});

  processRequest(req);
  res.setHeader('Content-Type', 'application/json');
  res.send('Req OK');
});

更多信息:https://github.com/request/request

答案 1 :(得分:1)

在你的情况下,request.redirect可能会有帮助。

app.get('/track', function(req, res) {
   //process the request

   //then redirect
   req.redirect('/final-endpoint');
});

然后在最终的endpont中捕获重定向的请求。

app.get('/final-endpoint', function(req, res) {
       // proceess redirected request here.
});

请参阅Express docs

答案 2 :(得分:1)

如果您的第二个端点位于不同的服务器上(例如PHP),那么您将需要重定向客户端(如sohel's answer中所述),或者将来自Node的请求欺骗到PHP服务器,然后将响应发送回客户端。后一种选择绝对不重要,所以我会质疑不使用客户端重定向是否至关重要。

如果您正在谈论两个快速端点,那么我认为最简单的答案可能不是实际转发,而是直接使用端点回调:

app.get('/track', trackCallback);
app.get('/otherendpoint', otherendpointCallback);

function otherendpointCallback(req, res) {
  // do your thing
}

function trackCallback(req, res) {

  otherendpointCallback(req, res);

  processRequest(req);
  res.setHeader('Content-Type', 'application/json');
  res.send('Req OK');
};

根据您在另一个端点的确切要求,您可能需要欺骗某些req的字段(例如req.url