Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js API MongoDB请求仅在本地主机上工作_Node.js_Mongodb - Fatal编程技术网

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

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

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

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

起初,我甚至无法从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
  });
});
得到同样的结果

编辑#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
  • 更改node.js 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' }