无法从浏览器连接到Node.js Express服务器

4

我对Node.js和Express还很陌生。我正在学习Pedro Teixeria的书籍“Professional Node.js”的指导。我已经在Rackspace Cloud托管的CentOS服务器上安装了Node.js。然后,我安装了Express -

$ npm install -g express@2.5.x

这个命令安装了 Express 2.5.11,我已确认。
$ which express

然后,我使用以下命令初始化我的应用程序:

$ express my_app

这会创建一个带有默认文件的名为my_app的文件夹。最后,它还告诉我安装依赖项,我用以下命令执行此操作。进入my_app文件夹并发出命令。

$ npm install

我编辑了routes/index.js文件。现在它是这样的 -

/*
 * GET home page.
 */
module.exports = function(app){
app.get('/', function(req, res){
  res.render('index', { title: 'Express' });
});
};

我在routes文件夹下创建了一个名为users.js的文件。所以我的routes/users.js文件看起来像这样:
/*
 * GET home page.
 */
module.exports = function(app){
app.get('/users/:name', function(req, res){
  res.render('users/profile', { title: 'User Profile' });
});
};

然后我编辑了my_app文件夹(即主应用程序文件夹)中的应用程序文件。现在我的应用程序看起来像这样 -

/**
 * Module dependencies.
 */

var express = require('express')
  , routes = require('./routes');

var app = module.exports = express.createServer();

// Configuration

app.configure(function(){
  app.set('views', __dirname + '/views');
  app.set('view engine', 'jade');
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(app.router);
  app.use(express.static(__dirname + '/public'));
});

app.configure('development', function(){
  app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
});

 app.configure('production', function(){
  app.use(express.errorHandler());
});

// Routes

require('./routes/index')(app);
require('./routes/users')(app);

app.listen(5124, function(){
  console.log("Express server listening on port %d in %s mode", app.address().port, app.settings.env);
});

现在,我使用以下命令在my_app文件夹中启动服务器 -
$ node app

我看到输出的信息是“Express server listening on port 5124 in development mode”

但是,当我在浏览器中输入URL 50.56.246.162:5124/users时,我看到Firefox报告“无法连接” 但是,至少应该显示一些错误。指令说,它应该至少显示“无法定位视图“users/index”,尝试:等等等等。

由于我已经在Linux shell中以root身份完成了所有操作,因此我还更改了权限,以便可以从浏览器中查看。此外,我不认为我需要编辑iptables来打开端口。 我做错了什么。 任何帮助都将不胜感激。


你是否已经配置了一个Web服务器(如Apache或nginx)来提供Node.js服务器端点的服务? - Stephen Wright
1
我不明白你的意思。因为Node.js Express本身创建了HTTP服务器,所以不需要Apache或Nginx。 - Jay
由于您的应用程序未在标准端口上提供服务,因此您需要在iptables规则中打开该端口或安装代理(例如Apache或nginx)以允许您将请求重定向到正确的端点。鉴于上述情况,我建议您将应用程序更改为在可访问Web的端口上提供服务,这样您就不需要代理。 - Stephen Wright
谢谢Stephen - 你是对的。我必须打开端口。 - Jay
2个回答

0

你最好使用Express应用程序生成器安装最新版本...

npm install express-generator -g

express my_app

cd my_app && npm install

SET DEBUG=my_app:* & npm start

我已经按照您指定的方式进行了操作。我想知道 - expres-generator有什么特别之处?此外,在按照您的说明操作后,我检查了my_app文件夹中的app.js。现在,app.js完全不同,并且没有定义端口号。在以前的情况下,默认情况下端口号始终为3000。由于现在缺少端口号,我该如何在浏览器中打开它? - Jay
这可能是构建开箱即用的应用程序最快、最有效的方式。端口号将在bin/www中,它将是3000。使用npm start运行应用程序,然后转到浏览器并输入127.0.0.1:3000。 - Alex Legg

0

根据我在Rackspace的经验,rackspace不允许您访问除80和8080端口之外的端口。如果您正在使用共享环境,则端口80将已被apache使用。我解决这个问题的方法是安装nginx并在端口8080上运行它,然后为节点应用程序创建反向代理。也就是说,任何请求到达您共享主机的8080端口都将路由到您运行节点实例的任何端口。

  1. 安装nginx
  2. 按照以下方式编辑/etc/nginx/conf.d/default.conf文件:

    server { listen 0.0.0.0:8080; server_name test.server; access_log /var/log/nginx/test.server.log;

    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header HOST $http_host;
        proxy_set_header X-NginX-Proxy true;
    
        proxy_pass http://127.0.0.1:5124;
    }
    

    }

之后,启动节点进程并让它在后台运行。更好的选择是使用进程管理器,如pm2。现在,如果您在浏览器中输入50.56.246.162:8081,应该会跳转到应用程序页面。


这不正确。我已经在Rackspace Cloud中仅使用Node(即没有Express)创建了一个http服务器。这个小型聊天应用程序使用socket.io模块,并且在某个端口上成功运行。如果您想要,我可以在此处粘贴代码。服务器运行完美,多个用户可以聊天。有趣的是,我没有使用iptables打开任何端口。然而,我在使用Express框架时遇到了问题。我不知道是什么原因导致了这个问题。 - Jay
正如@Stephen Wright在评论中提到的那样,您无法访问该应用程序,因为它正在运行在浏览器无法访问的端口上。我假设您的代码在本地环境下工作。这正确吗? - Praveesh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接