gpt4 book ai didi

Node.js API MongoDB 请求仅在本地主机上工作

转载 作者:太空宇宙 更新时间:2023-11-03 23:33:24 26 4
gpt4 key购买 nike

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

当我从本地主机访问应用程序而不是从外部源访问它时,该应用程序会运行。由于我使用移动设备访问服务器,因此很难判断错误是什么。当我尝试从其他地方访问它时,我可以看到主页,但看不到应用程序中的数据

起初我什至无法从本地主机获取它,所以我发现该代码及其在本地主机上工作。

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,它只能在外部工作。

最佳答案

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

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

关于Node.js API MongoDB 请求仅在本地主机上工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35517902/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com