Node.js API MongoDB请求只在本地主机上工作(更新)

我工作的应用程序,我正在请求运行在查询MongoDBNode.js上的API的数据。

当我从本地主机访问它时运行的应用程序,而不是从外部源访问。 很难说,因为我正在使用移动设备访问服务器错误是什么。 当我尝试从其他地方访问它时,我可以看到主页面,但没有看到APP的数据

起初我甚至无法从本地主机获得它,所以我发现代码和它的本地主机上的工作。

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 }); }); 

我第一次使用Node.js和AngularJs请和我一起裸照。 我真的想要得到这个代码。

我也尝试了;

 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从本地主机改为我的真实IP,并且在Node.js控制台中出现这个错误

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

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

有两种解决scheme可以尝试:

  1. 使用您当前的解决scheme,设置Access-Control-Allow-Origin: * 。 这将违反 每个现代浏览器重要内置 CORS策略。 因为它开放了所有的API到世界上,你的系统将不会受到保护。
  2. 将node.js API的实现更改为支持/icons API的跨源请求,并且只接受来自某些IP地址的GET请求 。 在angular部分,使用$ http.jsonp来调用api。 您的系统将更安全。 看到这个SOpost了解node.js上jsonp的实现。

确保您的节点服务器在您的计算机上运行internalIp – 这可能是192.168.0.10 ,也是在您的external source (即时通讯假设这是一个电话上的浏览器),请确保您引用了192.168.0.10:PORT_NUMBER_HERE (你的内部IP,请检查这个http://www.computerhope.com/jargon/i/internip.htm )在你的HTML,或PHP,或任何你使用的语言。

如果您尝试访问AppAPI调用,请确保源代码中的任何url's都引用了您的internal ip 。 另外,请确保您的设备运行API调用,与您的节点服务器连接到相同的Internetnetworking。

希望这有助于你提供非常less的信息,以试图访问api调用。