Node.js API MongoDB请求仅适用于localhost

时间:2016-02-20 01:12:13

标签: node.js mongodb

我正在开发一个APP,我正在从 Node.js 上运行的API请求数据,该 Node.js 查询 MongoDB

当我从localhost访问app但不从外部源访问时,app会运行。由于我使用移动设备访问服务器,因此很难说出错误。 当我尝试从其他地方访问它时,我可以看到主页面而不是来自APP的数据

起初我甚至无法从localhost获取它,所以我找到了代码并且它在localhost上工作。

app.all('/*', function (req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");
  res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
  res.header("Access-Control-Allow-Headers", "X-Requested-With");
  next();
});

是的,这不安全。

修改

我希望能够从任何地方连接到我的电脑并使用该应用程序。

Node.js 服务器如下;

var express = require('express');
var app = express(); 
 app.use(express.static(__dirname + '/www'));
app.listen(80);

我的APP

   var express = require('express');
    var MongoClient = require('mongodb').MongoClient;
    var assert = require('assert');
    var ObjectId = require('mongodb').ObjectID;
    var url = 'mongodb://localhost:27017/site'; 
    var app = express();

//This was added because I was getting cross domain error even on local network
        app.all('/*', function (req, res, next) {
        res.header("Access-Control-Allow-Origin", "*");
        res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
        res.header("Access-Control-Allow-Headers", "X-Requested-With");
        next();
        });
   // NOT SECURE

    var findIco = function(db, callback) {
        db.collection('footIco').find().toArray(function(err, docs) {
            if (err) return callback(err, null);
            return callback(null, docs);
        });
    }

app.get('/icons', function(req, res){
  MongoClient.connect(url, function(err, db) {
    if(err) {
      console.log(err);
      return res.status(500).send(err);
   }
    findIco(db, function(err, icons) {
        if(err){
          res.status(500).json(err);
        }
        else{
            if(!icons){
              res.status(204).send();
              }
              else{
                  res.json(icons);
                  }
               db.close();
               return;
            }
        });  
    });
  });

JavaScript ;

var app = angular.module('app', ["ngSanitize"]);
app.controller('footIconCtrl', function($scope, $http) {

$http({
  method: 'GET',
  url: 'http://localhost:8080/icons'  // <--- Will only work locally
  //url: 'http://my.ip.addr.:8080/icons'  // <--- Will only work extrernally
})
  .then(function(icons) {
  console.log(icons);
    $scope.icons = icons.data;
  })
  .catch(function(errRes) {
    // Handle errRess
  });
});

我也试过了;

app.controller('footIconCtrl', function($scope, $http) {

var url = 'http://my.ip.add.res:8080/icons&callback=JSON_CALLBACK';

 $http.jsonp(url).success(function(data) {
    //what do I do here?
     $scope.icons=data;
});
});

获得相同的结果!

修改#2

刚刚发现是Mongo拒绝连接。我已经将我的所有ip从localhost更改为我的真实IP,我在Node.js控制台中收到此错误

{ [MongoError: connect ECONNREFUSED 111.222.333.444:27017]
  name: 'MongoError',
  message: 'connect ECONNREFUSED 111.222.333.444:27017' }

当然这不是我真正的知识产权,但今晚我不觉得被黑了!我不明白为什么只有当localhost作为地址提供时才能在本地工作,而另一方面,如果我提供我的WAN IP,它只能在外部工作。

2 个答案:

答案 0 :(得分:1)

您可以尝试两种解决方案:

  1. 使用当前解决方案设置jsonp。这将违反 重要的内置 每个现代浏览器的CORS政策。您的系统不会受到保护,因为它会向全世界打开所有API。
  2. 更改node.js API的实现,以支持仅 {{1}} API 的跨源请求,仅接受来自某些IP地址的GET请求。在角度部分,使用$http.jsonp来调用api。您的系统将更加安全。请参阅this SO post以了解node.js上{{1}}的实现情况。

答案 1 :(得分:1)

确保您的计算机上运行的节点服务器internalIp - 这可能是192.168.0.10,也可能是external source(我假设这是手机上的浏览器),确定您在html,php或您正在使用的任何语言中引用了192.168.0.10:PORT_NUMBER_HERE(您的内部IP,请检查此http://www.computerhope.com/jargon/i/internip.htm)。

如果您尝试访问来自API的{​​{1}}来电,请确保源代码中的所有App都引用您的url's。还要确保您正在运行internal ip来电的设备与节点服务器连接到同一个互联网网络。

希望这会有所帮助,因为您提供的信息很少,因为您尝试访问API来电。