Node.js API MongoDB请求仅在本地主机上工作
我正在开发一个应用程序,我正在从运行在Node.js(查询MongoDB)上的API请求数据 当我从本地主机(而不是从外部源)访问应用程序时,该应用程序将运行。很难说是什么错误,因为我正在使用移动设备访问服务器。 当我尝试从其他地方访问它时,我可以看到主页,但看不到应用程序中的数据 起初,我甚至无法从localhost获得它,所以我发现该代码和它在localhost上工作Node.js API MongoDB请求仅在本地主机上工作,node.js,mongodb,Node.js,Mongodb,我正在开发一个应用程序,我正在从运行在Node.js(查询MongoDB)上的API请求数据 当我从本地主机(而不是从外部源)访问应用程序时,该应用程序将运行。很难说是什么错误,因为我正在使用移动设备访问服务器。 当我尝试从其他地方访问它时,我可以看到主页,但看不到应用程序中的数据 起初,我甚至无法从localhost获得它,所以我发现该代码和它在localhost上工作 app.all('/*', function (req, res, next) { res.header("Access
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);
我的应用程序
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
});
});
得到同样的结果
编辑#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' }
当然这不是我真正的IP,但我今晚不想被黑客攻击!我不明白为什么只有当localhost作为地址提供时,它才能在本地工作,而另一方面,如果我提供WAN IP,它只能在外部工作。您可以尝试以下两种解决方案:
访问控制允许原点:
一起使用。这将违反每个现代浏览器的重要内置CORS策略。您的系统将不受保护,因为它将向世界开放所有API/icons
API的跨源请求,并且仅接受来自某些IP地址的GET请求。在角度部分,用于调用api。您的系统将更加安全。请参阅以了解node.js上的jsonp
的实现李>
确保您的节点服务器在您的计算机上运行
internalIp
-这可能是192.168.0.10
,也可能是在您的外部源上运行的(我假设这是手机上的浏览器),确保您在html或php中引用了192.168.0.10:PORT\u NUMBER\u
(您的内部IP,请选中此项),或者你用的任何语言
如果您试图从App
访问API
调用,请确保源代码中的任何url
都引用了您的内部ip
。另外,请确保运行API
调用的设备已连接到与节点服务器相同的internet网络
希望这对您有所帮助,因为您提供的信息很少,无法确定您尝试从何处访问api
调用。您必须转发端口或与您尝试连接的设备连接到同一个本地网络。另外,请求http://localhost:8080当本地主机==127.0.0.1
表示此计算机/设备时,来自外部设备的没有意义。你的帖子不是非常清晰,但据我所知,当这些标题出现时,你能够连接吗?如果是这种情况,这意味着必须启用CORS(Access Control Allow Origin
)才能请求该资源。是的,我需要这些头才能使应用程序正常工作。所以我必须使用完整的地址。我会试试的,谢谢!如果您在开发时需要这些标题,我建议您将它们放在If子句中。例如:if(process.env.NODE_env!=“production”){//addheaders…}
。然后,当您将脚本部署到生产环境时,您需要执行export NODE_ENV=production
,然后启动应用程序,并且不会添加这些标题(强烈建议您在部署时将NODE_ENV
设置为production
),我已经添加了完整的代码。我是这个节点交易的新手,所以我不知道如何实现一个安全和有效的代码。因此,只需按照So链接使用res.jsonp和$http.jsonp.app.controller('footIconCtrl',function($scope,$http){var url='';$http.jsonp(url).success(function(data){$scope.icons=data;});我得到了完全相同的结果。
{ [MongoError: connect ECONNREFUSED 111.222.333.444:27017]
name: 'MongoError',
message: 'connect ECONNREFUSED 111.222.333.444:27017' }