我正在开发一个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,它只能在外部工作。
答案 0 :(得分:1)
您可以尝试两种解决方案:
jsonp
。这将违反 重要的内置 每个现代浏览器的CORS政策。您的系统不会受到保护,因为它会向全世界打开所有API。答案 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
来电。