【发布时间】:2016-06-01 18:28:28
【问题描述】:
我正在开发一个应用程序,我正在从一个运行在 Node.js 上的 API 请求数据,该 API 查询一个 MongoDB。
当我从 localhost 但不是从外部源访问应用程序时,它会运行。由于我使用移动设备访问服务器,因此很难说出错误是什么。 当我尝试从其他地方访问它时,我可以看到主页,但看不到来自 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);
我的应用程序
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' }
当然,这不是我的真实 IP,但我不想今晚被黑!而且我不明白为什么只有在提供 localhost 作为地址时它才能在本地工作,而另一方面,如果我提供我的 WAN IP,它只会在外部工作。
【问题讨论】:
-
您必须转发您的端口或连接到与您尝试连接的设备相同的本地网络。此外,从您的外部设备请求
http://localhost:8080与localhost == 127.0.0.1一样没有意义,这意味着这台计算机/设备。你的帖子不是很清楚,但据我了解,当这些标题出现时你能够连接?如果是这种情况,这意味着 CORS (Access-Control-Allow-Origin) 必须启用*才能请求该资源。 -
是的,我需要这些标题才能使应用程序正常工作。所以我将不得不使用完整的地址。试试看,谢谢!
-
如果你在开发时需要这些头文件,我建议你把它们放在一个 if 子句中。例如:
if(process.env.NODE_ENV !== 'production') { // add headers... }。然后,当您将脚本部署到生产环境时,您将执行export NODE_ENV=production然后启动您的应用程序并且不会添加这些标头(强烈建议将NODE_ENV设置为production部署时)