Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.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
Javascript 无法访问Google Compute Engine上托管的NodeJS Express应用程序_Javascript_Node.js - Fatal编程技术网

Javascript 无法访问Google Compute Engine上托管的NodeJS Express应用程序

Javascript 无法访问Google Compute Engine上托管的NodeJS Express应用程序,javascript,node.js,Javascript,Node.js,我在谷歌云上有一个f1微实例。在已安装的ubuntu 14.04、NodejS 0.10和mongoDB中。现在,我用yeoman制作了一个express应用程序,它在localhost上运行得非常好。但是当我尝试在实例中运行它时,我无法访问它 以下是我的工作: 将本地代码提交到BitBucket 通过SSH将代码从BitBUcket克隆到Google计算引擎 运行命令grunt 使用浏览器上的端口号访问谷歌提供的外部IP,但谷歌表示此网页不可用 以下是我的源代码: **app.js** 'us

我在谷歌云上有一个f1微实例。在已安装的ubuntu 14.04、NodejS 0.10和mongoDB中。现在,我用yeoman制作了一个express应用程序,它在localhost上运行得非常好。但是当我尝试在实例中运行它时,我无法访问它

以下是我的工作:

  • 将本地代码提交到BitBucket
  • 通过SSH将代码从BitBUcket克隆到Google计算引擎
  • 运行命令grunt
  • 使用浏览器上的端口号访问谷歌提供的外部IP,但谷歌表示此网页不可用
  • 以下是我的源代码:

    **app.js**

    'use strict';
    
    // Module dependencies.
    var express = require('express'),
        path = require('path'),
        fs = require('fs'),
        methodOverride = require('method-override'),
        morgan = require('morgan'),
        bodyParser = require('body-parser'),
        errorhandler = require('errorhandler');
    
    var app = module.exports = exports.app = express();
    
    app.locals.siteName = "Server";
    
    // Connect to database
    var db = require('./config/db');
    app.use(express.static(__dirname + '/public'));
    
    
    // Bootstrap models
    var modelsPath = path.join(__dirname, 'models');
    fs.readdirSync(modelsPath).forEach(function (file) {
      require(modelsPath + '/' + file);
    });
    
    var env = process.env.NODE_ENV || 'development';
    
    if ('development' == env) {
        app.use(morgan('dev'));
        app.use(errorhandler({
            dumpExceptions: true,
            showStack: true
        }));
        app.set('view options', {
            pretty: true
        });
    }
    
    if ('test' == env) {
        app.use(morgan('test'));
        app.set('view options', {
            pretty: true
        });
        app.use(errorhandler({
            dumpExceptions: true,
            showStack: true
        }));
    }
    
    if ('production' == env) {
        app.use(morgan());
         app.use(errorhandler({
            dumpExceptions: false,
            showStack: false
        }));
    }
    
    app.engine('html', require('ejs').renderFile);
    app.set('view engine', 'html');
    app.use(methodOverride());
    app.use(bodyParser.json());
    app.use(bodyParser.urlencoded({ extended: true }));
    
    // Bootstrap routes
    var routesPath = path.join(__dirname, 'routes');
    fs.readdirSync(routesPath).forEach(function(file) {
      app.use('/', require(routesPath + '/' + file));
    });
    
    // Bootstrap api
    var apiPath = path.join(__dirname, 'api');
    fs.readdirSync(apiPath).forEach(function(file) {
      app.use('/api', require(apiPath + '/' + file));
    });
    
    // Start server
    var port = process.env.PORT || 3000;
    app.listen(port, function () {
      console.log('Express server listening on port %d in %s mode', port, app.get('env'));
    });
    
    **Grunfile.js**

    module.exports = function(grunt) {
      require('load-grunt-tasks')(grunt);
      grunt.initConfig({
        // Configure a mochaTest task
        mochaTest: {
          test: {
            options: {
              reporter: 'spec'
            },
            src: ['test/**/*.js']
          }
        },
        watch: {
          options: {
            livereload: true,
          },
          express: {
            files:  [ '*.js','routes/*.js', 'models/*.js', 'config/*.js','api/*.js'  ],
            tasks:  [ 'express:dev' ],
            options: {
              spawn: false // Without this option specified express won't be reloaded
            }
          }
        },
        express: {
          options: {
            port : 3000,
            node_env: 'development'
          },
          dev: {
            options: {
              script: 'app.js',
              node_env: 'development'
            }
          },
          prod: {
            options: {
              script: 'app.js',
              node_env: 'production'
            }
          }
        },
        open: {
          server: {
            url: 'http://localhost:3000' 
          }
        }
      });
    
      grunt.registerTask('test', 'mochaTest');
    
      grunt.registerTask('server', function(arg) {
        if(arg && arg == 'prod')
        {
          grunt.task.run([
            'express:prod',
            'open',
            'watch'
          ]);
        }
        else
        {
          grunt.task.run([
            'express:dev',
            'open',
            'watch'
          ]);
        }
      });
      grunt.registerTask('default', [ 'server' ]);
      grunt.registerTask('dist', [ 'server:prod' ]);
    
    };
    

    我试着改变这个应用程序。用谷歌提供的内部IP收听,但仍然没有成功。有什么想法吗?

    好吧,我就想出来了。其实很简单。 问题只出在端口上。我只需要更改防火墙设置以允许来自任何源的端口。就这样

  • 转到谷歌云控制台
  • 网络>防火墙规则
  • 查找tcp和udp范围为1-65535的条目“默认允许内部”。编辑它并更改源过滤器以允许它来自任何源。
  • 使用重新启动应用程序。现在应该可以了

  • 2017年4月27日更新:GCE上的流程现在略有变化。编辑源过滤器->ip范围为0.0.0.0/0

    确定到目前为止,我已将端口更改为80,看起来可以正常工作。然而,我想使用端口3000,不知道如何在谷歌云控制台中使用它。对我来说,HTTP/HTTPS流量不会进入我的应用程序端口(不是默认值),所以我必须编辑默认的允许HTTP、默认允许HTTPS防火墙规则。