简体   繁体   English

为什么我需要显式调用 app.listen(port) 以使 express-ws 工作?

[英]Why do I need to explicitly call app.listen(port) in order to make express-ws working?

I'm new to NodeJS Express, I was following the official tutorial from express-ws to setup websocket in the simple project generated by npx express-generator .我是 NodeJS Express 的新手,我正在按照express-ws的官方教程在 npx npx express-generator生成的简单项目中设置 websocket 。 In the app.js, I've to explicitly call the app.listen(3000) in order to make the ws connection working.在 app.js 中,我必须显式调用app.listen(3000)以使 ws 连接正常工作。 Am I doing this correctly although it is working?尽管它正在工作,但我这样做是否正确? What's the difference between app.listen vs. server.listen in this case?在这种情况下app.listenserver.listen有什么区别? what is app.set(port,port) in www.js used for? www.js 中的app.set(port,port)是做什么用的?

app.js - I've to add the last line below: app.js - 我必须在下面添加最后一行:

var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');

var app = express();
var expressWs = require('express-ws')(app);

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

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

app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));


app.use('/', indexRouter);
app.use('/users', usersRouter);

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  next(createError(404));
});

// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

module.exports = app;
app.listen(3001)// for websocket listen port

www.js - this file was generated by the express-generator and I see it's already calling app.set('port',port) and server.listen(port) www.js - 这个文件是由 express-generator 生成的,我看到它已经在调用app.set('port',port)server.listen(port)

#!/usr/bin/env node

/**
 * Module dependencies.
 */

var app = require('../app');
var debug = require('debug')('xapp: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);
}

The .listen(port) method on either a server object or on the Express app object is what actually starts your server so that it is listening for incoming requests.服务器 object 或 Express 应用程序 object 上的.listen(port)方法实际上是启动服务器的方法,以便它监听传入的请求。 Without that, you don't have a running http server.没有它,您就没有正在运行的 http 服务器。 And, you need a running http server for both Express and for your webSocket.而且,您需要为 Express 和 webSocket 运行 http 服务器。 If you don't call something that triggers server.listen() , then you won't have a running server.如果您不调用触发server.listen()的东西,那么您将没有正在运行的服务器。 It will be all configured and waiting to start, but won't yet be running.它将全部配置并等待启动,但尚未运行。

If you look at the code for app.listen() , it is just a helper function.如果您查看app.listen()的代码,它只是一个帮助程序 function。 All, it does is this:总而言之,它是这样的:

app.listen = function listen() {
  var server = http.createServer(this);
  return server.listen.apply(server, arguments);
};

It creates an http server object and then calls .listen() on it.它创建一个 http 服务器 object,然后在其上调用.listen() It's just a shortcut.这只是一个捷径。 If you have a reason to want to create your own http server object and then call server.listen() on that one, you can do it that way too.如果您有理由想要创建自己的 http 服务器 object 然后在该服务器上调用server.listen() ,您也可以这样做。 In fact, if you're starting an https server, you have to do it that way because you have to pass the right arguments to https.createServer() which app.listen() doesn't do for you.实际上,如果您要启动 https 服务器,则必须这样做,因为您必须将正确的 arguments 传递给https.createServer() app.listen() for you dolist.'

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM