【问题标题】:NodeJS does not respond to CURL RequestNodeJS 不响应 CURL 请求
【发布时间】:2013-04-23 12:55:15
【问题描述】:

我正在使用 NodeJS 对 MongoDB 执行 som 查询。 我已经设置了路由,所以当

     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 文件:

$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 请求处理程序文件。

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

【问题讨论】:

  • 您是否验证了curl 正在从 PHP 脚本中正确运行? (您的 PHP 脚本是否正确获取任何页面?您是否测试过直接从命令行运行 curl?)
  • 另外,您的 PHP 脚本正在执行 curl POST 请求而不是 GET;这可能是问题吗?
  • 你能发布设置路由/服务器的nod​​e.js代码吗?
  • 你可以在这里找到它github.com/josefottosson/exjobb/tree/master/nodeJS但是我现在已经解决了,我将我的PHP代理更改为以下设置$method = $_SERVER['REQUEST_METHOD']; $url = $_POST['url']; $curl=curl_init(); curl_setopt_array($curl, array( CURLOPT_RETURNTRANSFER =&gt; 1, CURLOPT_URL =&gt; $url, CURLOPT_USERAGENT =&gt; 'Josefs PHPPROXY' )); $result = curl_exec($curl); curl_close($curl); echo $result;感谢apsillers!

标签: javascript node.js curl mongojs


【解决方案1】:

如 cmets 中所述已解决。

问题是我的 curl 请求中的这一行。

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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-16
    • 2019-06-22
    • 1970-01-01
    • 2020-08-08
    相关资源
    最近更新 更多