2013-04-23 180 views
1

使用NodeJS來執行som查詢到MongoDB。 我已經設置了路由,所以當NodeJS不響應CURL請求

 http://127.0.0.1:8888/GetAllCities 

被調用時,函數名GetAllCities將在服務器上運行,並執行MongoDB的查詢並返回結果。 當我嘗試直接在瀏覽器中訪問該頁面時,此功能正常。 但是當我嘗試做一個CURL請求時,響應是空的。

這是我的jQuery AjaxCall的

function makeCall(urlToCall, method) 
    { 
     var params = "url=" + urlToCall + method; 
     if(app === "PHP") 
     { 
      params += "&PHP=PHP"; 
     } 

     $.ajax({ 
      type: "POST", 
      url: "phpProxy.php", 
      data: params, 
      beforeSend: function() 
      { 
       document.write(app + ' -- Starting round ' + (i+1) + "<br />"); 
       document.write('URL: ' + params + "<br />"); 
       startTime = new Date().getTime(); 
      }, 
      success: function(data) { 
       endTime = new Date().getTime(); 
       totalTime = endTime - startTime; 
       if(totalTime > highest) 
       { 
        highest = totalTime; 
       } 
       if(totalTime < lowest) 
       { 
        lowest = totalTime; 
       } 
       var row = {}; 
       row.app = app; 
       row.operation = method; 
       row.totalTime = totalTime; 
       row.run = i+1; 
       row.date = new Date(); 
       document.write('\tTotal time: <strong>' + totalTime + 'ms</strong>' + "<br />"); 
       times.push(row); 
       document.write(data + "<br />"); 
       document.write('Round done\n' + "<br />" + "<br />"); 
      }, 
      error: function(err) { 
       console.log('Error'); 
       console.log(err); 
      }, 
      complete: function() 
      { 
       i++; 
       if(i < 50) 
       { 
        makeCall(urlToCall, method); 
       } 
       else 
       { 
        var sum = 0; 
        for(var j = 0; j < times.length; j++) 
        { 
         sum += parseInt(times[j].totalTime); 
        } 
        var avg = sum/times.length; 
        $('body').prepend('<h3>Slowest: ' + highest + 'ms</h3>'); 
        $('body').prepend('<h3>Fastest: ' + lowest + 'ms</h3>'); 
        $('body').prepend('<h3>Average: ' + avg + 'ms</h3>'); 

        myApp.saveToDb(times); 
       } 
      } 
     }); 
    } 

這是我PHPPROXY FILE:

$method = $_SERVER['REQUEST_METHOD']; 

$url = $_POST['url']; 

$curl=curl_init(); 
curl_setopt($curl,CURLOPT_URL, $url); 
curl_setopt($curl,CURLOPT_POST, TRUE); 

if(isset($_POST['PHP'])) 
{ 
    $params = array('a' => 'php'); 
    curl_setopt($curl, CURLOPT_POSTFIELDS, $params); 
} 
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE); 

$result = curl_exec($curl); 
curl_close($curl); 

echo $result; 

,這是我的NodeJS requesthandlerfile。

var Db = require('mongodb').Db; 
var Server = require('mongodb').Server; 
var querystring = require("querystring"); 



function GetAllCities(response) 
{ 
    console.log('Request recieved'); 
    var databaseUrl = "exjobb"; 
    var collections = ["cities"] 
    var db = require("mongojs").connect(databaseUrl, collections); 
    db.cities.find(function(err, cities) { 
    response.writeHead(200, {"Content-Type": "application/json"}); 
    response.write(cities.length + " rows selected from the Database"); 
    response.end(); 
    db.close(); 
    }); 
} 

function GetAllCitiesWhere(response) 
{ 

    var databaseUrl = "exjobb"; 
    var collections = ["cities"] 
    var db = require("mongojs").connect(databaseUrl, collections); 
    db.cities.find({state: "AL"}, function(err, cities) { 
    response.writeHead(200, {"Content-Type": "application/json"}); 
    response.write(cities.length + " rows selected from the Database"); 
    response.end(); 
    }); 
} 

exports.start = start; 
exports.GetAllCities = GetAllCities; 
exports.GetAllCitiesWhere = GetAllCitiesWhere; 

TLDR;我的代碼在瀏覽器中訪問頁面時直接獲取GET,但是在發出Ajax請求時無法工作,爲什麼? 你可以找到所有的代碼here

+0

是否已確認'curl'是currectly從PHP腳本運行? (您的PHP腳本是否正確地獲取任何頁面?您是否已經直接從命令行測試了運行'curl'?) – apsillers 2013-04-23 13:03:42

+1

另外,您的PHP腳本正在執行'curl'' POST'請求​​而不是'GET';這可能是問題嗎? – apsillers 2013-04-23 13:06:33

+0

你可以發佈設置路由/服務器的nod​​e.js代碼嗎? – 2013-04-23 13:35:20

回答

0

這是解決註釋中所述。

問題是我的捲髮請求中的這一行。

curl_setopt($curl,CURLOPT_POST, TRUE); 

我改變了我的PHP代理以下設置:

$method = $_SERVER['REQUEST_METHOD']; 
$url = $_POST['url']; 
$curl=curl_init();  
curl_setopt_array($curl, array(CURLOPT_RETURNTRANSFER => 1, 
CURLOPT_URL => $url,CURLOPT_USERAGENT => 'Josefs PHPPROXY')); 
$result = curl_exec($curl); 
curl_close($curl); 
echo $result;