【问题标题】:My Express 4.13.1 app listens on 2 different ports我的 Express 4.13.1 应用程序侦听 2 个不同的端口
【发布时间】:2016-02-17 16:04:01
【问题描述】:

我遇到了一些奇怪的事情。可能是因为我是 Express 和 Node 的新手。

我使用的是 Express 4.13.1,默认情况下它在 3000 端口上运行。

但是,当我将此行添加到我的 app.js 时:

app.listen(8080);

应用开始监听 3000 和 8080 端口。 控制台输出为:

/usr/local/bin/node --debug-brk=62380 --nolazy bin/www
Debugger listening on port 62380
Mon, 16 Nov 2015 13:59:13 GMT chatDel:server Listening on port 3000

但需要明确的是,两个端口上的请求都有响应。

我错过了什么?

这是我的 app.js

var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var mongoose = require('mongoose');
var fs = require('fs');
var autoIncrement = require('mongoose-auto-increment');
var config = require('./config/serverConfig');

var routes = require('./routes/index');
var users = require('./routes/users');
var inmsg = require('./routes/inmsg');

var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

// uncomment after placing your favicon in /public
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', routes);
app.use('/users', users);
app.use('/inmsg', inmsg);
app.listen(8080);


var connection =             mongoose.createConnection(config.mongoose.connectionString);
global.db = connection;
autoIncrement.initialize(connection);

//load all files in model dir
fs.readdirSync(__dirname + '/models').forEach(function(filename){
  if(~filename.indexOf('.js')) require(__dirname + '/models/' + filename);
});


// catch 404 and forward to error handler
app.use(function(req, res, next) {
  var err = new Error('Not Found');
  err.status = 404;
  next(err);
});

// error handlers

// development error handler
// will print stacktrace
if (app.get('env') === 'development') {
  app.use(function(err, req, res, next) {
    res.status(err.status || 500);
    res.render('error', {
      message: err.message,
      error: err
    });
  });
}

// production error handler
// no stacktraces leaked to user
app.use(function(err, req, res, next) {
  res.status(err.status || 500);
  res.render('error', {
    message: err.message,
    error: {}
  });
});

module.exports = app;

这是我的 Package.jason:

{
  "name": "chatDel",
  "version": "0.0.0",
  "private": true,
  "scripts": {
    "start": "node ./bin/www"
  },
  "dependencies": {
"body-parser": "~1.13.2",
"cookie-parser": "~1.3.5",
"debug": "~2.2.0",
"express": "~4.13.1",
"indicative": "^1.3.1",
"jade": "~1.11.0",
"mongodb": "~3.0.7",
"mongoose": "^4.2.4",
"mongoose-auto-increment": "^5.0.1",
"morgan": "~1.6.1",
"serve-favicon": "~2.3.0",
"stately.js": "^1.3.0"
  }
}

编辑: 我采取了更多行动:

  1. 我重新启动了计算机
  2. 我确保没有“节点”进程处于活动状态
  3. 我再次从我的 IDE 开始调试
  4. 同样,两个端口都可用(8080 和 3000),并且在我的计算机的进程列表中只有 1 个“节点”进程可见。(我使用的是 macbook pro)

当我将侦听端口的行更改为:app.listen(3000) 时,我在控制台中调试时收到以下错误:(同样,只有 1 个节点进程可见,然后在大约 10 秒后退出从错误中。)

/usr/local/bin/node --debug-brk=49558 --nolazy bin/www 调试器监听端口 49558 端口 3000 已在使用中

进程以退出代码 1 结束

编辑 2: 这是我的 www 文件,它位于 /bin/www 下,它没有扩展名,尽管它是一个 js 文件并且它是作为安装的一部分生成的。

#!/usr/bin/env node

/**
 * Module dependencies.
 */

var app = require('../app');
var debug = require('debug')('chatDel:server');
var http = require('http');

/**
 * Get port from environment and store in Express.
 */

var port = normalizePort(process.env.PORT || '3000');
app.set('port', port);

/**
 * Create HTTP server.
 */

var server = http.createServer(app);

/**
 * Listen on provided port, on all network interfaces.
 */

server.listen(port);
server.on('error', onError);
server.on('listening', onListening);

/**
 * Normalize a port into a number, string, or false.
 */

function normalizePort(val) {
  var port = parseInt(val, 10);

  if (isNaN(port)) {
    // named pipe
    return val;
  }

  if (port >= 0) {
    // port number
    return port;
  }

  return false;
}

/**
 * Event listener for HTTP server "error" event.
 */

function onError(error) {
  if (error.syscall !== 'listen') {
    throw error;
  }

  var bind = typeof port === 'string'
    ? 'Pipe ' + port
    : 'Port ' + port;

  // handle specific listen errors with friendly messages
  switch (error.code) {
    case 'EACCES':
      console.error(bind + ' requires elevated privileges');
      process.exit(1);
      break;
    case 'EADDRINUSE':
      console.error(bind + ' is already in use');
      process.exit(1);
      break;
    default:
      throw error;
  }
}

/**
 * Event listener for HTTP server "listening" event.
 */

function onListening() {
  var addr = server.address();
  var bind = typeof addr === 'string'
    ? 'pipe ' + addr
    : 'port ' + addr.port;
  debug('Listening on ' + bind);
}

【问题讨论】:

  • 那么,调试器在 62380 上监听,而 Web 服务器本身在 3000 上。问题是什么? 8080 端口此时不应响应。向我们展示服务器代码,以便我们检查。
  • 在将代码更改为端口 8080 之前,您是否确定没有运行旧实例?
  • 是的,我有,当我停止服务器时,没有任何东西在监听,当我在调试模式下启动它时,两个端口都可用。我现在将添加一些服务器代码。
  • 顺便说一句,我使用 Webstorm 11 作为 IDE。和节点 4.2.2
  • 你有 app.listen(8080) 在那里,所以这解释了 8080。你确定 3000 不只是你的需求或其他东西中的剩余日志语句吗?

标签: node.js express


【解决方案1】:

如评论线程中所述 - 检查您的 /bin/www 而不是 app.js。 :)

【讨论】:

  • 能否请您在 www 文件上增加一些亮点?任何类型的信息都可以。另外,从我的错误中,我们学会了如何让应用程序在 2 个不同的端口上监听 :) 那么,它在服务器性能方面有什么好处吗? (请将其添加到您的答案中,而不是在 cmets 中)
猜你喜欢
  • 1970-01-01
  • 2016-04-20
  • 2019-01-13
  • 1970-01-01
  • 2012-11-01
  • 1970-01-01
  • 2021-05-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多