2015-08-21 4 views
3

В моем сценарии мне нужно отправить запрос вперед в другую конечную точку. На моей машине есть два сервера php и node.js. Node.js похож на «человека посередине», PHP-сервер должен работать одинаково.Как перенаправить запрос на другую конечную точку в node.js

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, он обрабатывает информацию запроса и он должен направить тот же requesto другой конечной точке.

Например:

  1. Получить локальный:? 3000/дорожки param1 = 1 & param2 = 2 Серверный процесс
  2. получить запрос
  3. сервер вперед получить запрос на локальный/окончательная конечная точка param1 = 1 & param2 = 2
+0

Нужно ли первая конечная точка, а вторая принадлежит к разным серверам? Я имею в виду, что в качестве примера первый из них является частью кода node.js, а второй - частью PHP-кода. – skypjack

ответ

7

в зависимости от того, что вы пытаетесь сделать, вы можете создать новый запрос к конечной точке:

//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

В случае вы request.redirect может помочь.

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

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

Затем перехватите перенаправленный запрос в окончательном конце.

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

См Express docs

+3

Я думаю, что это не намеренное поведение, поскольку перенаправление - это подсказка для клиента, которая вынуждена выполнять другой запрос на новую конечную точку. Вместо этого я предполагаю, что целью является тихое перенаправление запроса и отправка ответа, действующего как мост. – skypjack

+0

Спасибо! Решение @kmandov работает для меня. – mjimcua

1

Если вторая конечная точка находится на другом сервере (например, PHP), то вы собираетесь нужно либо перенаправить клиента (как в sohel's answer), или подделать запрос от узла к серверу 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 (например,)

+0

Спасибо! Решение @kmandov работает для меня. – mjimcua