首页
学习
活动
专区
圈层
工具
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么我需要显式地调用app.listen(端口)才能使express-ws工作?

在使用Express框架时,我们可以通过app.listen(端口)来启动一个HTTP服务器并监听指定的端口。而在使用express-ws插件时,它提供了WebSocket的支持,但是它并不会自动启动WebSocket服务器,需要我们显式地调用app.listen(端口)来启动WebSocket服务器。

这是因为WebSocket是基于HTTP协议的,它需要在HTTP服务器的基础上建立起WebSocket连接。而Express框架本身是基于Node.js的HTTP模块构建的,它可以创建一个HTTP服务器并监听指定的端口。当我们调用app.listen(端口)时,Express会创建一个HTTP服务器并开始监听指定的端口,这样就可以接收HTTP请求。

而express-ws插件则是在Express框架的基础上添加了WebSocket的支持。当我们在代码中使用express-ws插件创建WebSocket路由时,它会将WebSocket相关的处理逻辑添加到Express框架中。但是,为了使WebSocket服务器能够正常工作,我们仍然需要调用app.listen(端口)来启动HTTP服务器,这样WebSocket服务器才能建立在HTTP服务器之上。

总结起来,我们需要显式地调用app.listen(端口)来使express-ws工作,是因为WebSocket服务器需要建立在HTTP服务器之上,而Express框架本身是基于Node.js的HTTP模块构建的,需要通过调用app.listen(端口)来启动HTTP服务器。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

实时会话系统实现(2) --- express-ws改写会话系统

实际上在会话系统我们目前仅仅需要websocket连接,发送消息,接受消息三个方法,所以我们在websocket.js中定义这三个方法,然后使用module.exports导出,使得在任何界面都可以调用这几个方法...下一步需要在服务端实现wss接口。...接口是在chat.js中实现,接下来我们在chat.js中引用express-ws,这里需要注意如果分文件实现接口必须在app.js和具体的接口js文件都引入express-ws才可以正常使用。...然后接口的实现实际上和http接口实现方法类似,我们引入express-ws后实际上router就多了一个ws方法,就是用来书写websocket接口,然后接口中实际上是存在两部分逻辑,第一次调用就等于...可以发现我们使用websocket可以开启一个长连接成功实现实时会话系统,有消息送达马上接收渲染,而不用像http轮询一样不断地重复请求接口造成贷款和服务器资源的浪费。

98930

前端架构师破局技能,NodeJS 落地 WebSocket 实践

也许你会问:既然 Socket.IO 在 WebSocket 的基础上做了那么多的优化,并且非常成熟,那为什么还要搭一个原生 WebSocket 服务?...集成到 Express 框架的优点是,我们不需要单独监听一个端口,使用框架启动的端口即可,并且我们还可以指定访问到某个路由,才发起 WebSocket 连接。...幸运的是这一切不需要手动实现,express-ws 模块已经帮我们做好了大部分的集成工作。...首先安装,然后在入口文件引入: var expressWs = require('express-ws')(app) 和 Express 的 Router 一样,express-ws 也支持注册全局路由和局部路由...源码+答疑 本文所有的代码都是经过我亲自实践,为了便于小伙伴们查阅和试验,我建了一个 GitHub 仓库专门存放本文的完整源码,以及之后文章的完整源码。

1.8K20
  • 关于Node.js,一定要学这个10+万Star项目 !!

    Hey, 我是 沉浸式趣谈本文首发于【沉浸式趣谈】,我的个人博客 https://yaolifeng.com 也同步更新。转载请在文章开头注明出处和版权信息。...// 工作进程共享同一个TCP连接 const express = require('express'); const app = express(); // ...其他代码 app.listen...(3000, () => { console.log(`工作进程 ${process.pid} 监听端口3000`); });}效果立竿见影!...接触 Node.js Best Practices 后,我才明白写出高质量的 Node.js 代码需要考虑这么多方面。最后,强烈推荐每一个使用 Node.js 的开发者都去看看这个项目。...它不仅告诉你 "怎么做",更重要的是解释了 "为什么要这么做",这对于提升开发能力至关重要。

    3610

    git入门篇(1)--初识Gi

    可能很多人没有使用过Git但是也听说过Git,Git是一个分布式版本控制工具,我们在开始之前先来谈谈为什么我们需要一个版本控制工具。...如果不使用分布式版本控制工具我们只能创建一个文件夹,然后每次修改不断地另存为新的文件,然后来存储我们不同版本的论文。...SVN的大名可能很多人都听说过,集中式这个词其实已经可以体现这种版本控制工具的缺点,集中式版本控制工具必须联网才能使用,而且版本库都有一个单一的集中管理的服务器,用于管理所有文件的所有修改版本,我们工作之前需要先从中央服务器取得最新的版本...分布式版本控制工具可以在每个人的电脑中创建一个完整的版本库,因此分布式版本控制工具集中不需要存在一台统一管理版本库的服务器。那我们针对刚才说过的SVN的缺点来说明为什么我们要采用Git。...Git如何让做好备份工作 我们刚才一直在说Git在本地创建版本库,那版本库存储在本地磁盘,本地磁盘出问题我的所有版本库不就直接全部丢失了。

    52020

    关于Node,一定要学这个10+万Star项目!

    :https://practica.dev • Github:https://github.com/goldbergyoni/nodebestpractices 最厉害的是,它不像其他很多教程那样空洞地讲概念...详细的解释 - 为什么要这么做 3. 代码例子 - 好代码 vs 坏代码的对比 4....其他代码 app.listen(3000, () => { console.log(`工作进程 ${process.pid} 监听端口3000`); }); } 效果立竿见影...我最推荐的几条最佳实践 在所有的实践中,以下五条是我认为对前端开发转 Node.js 的开发者最有价值的: 1. 不要在客户端保存敏感信息 - 看似常识,但很多人会犯的错误 2....接触 Node.js Best Practices 后,我才明白写出高质量的 Node.js 代码需要考虑这么多方面。 最后,强烈推荐每一个使用 Node.js 的开发者都去看看这个项目。

    10210

    Node.js—Express使用、Express 路由 、Express 中间件、托管静态资源、使用 Express 写接口、node.js链接sqlite数据库

    Express 安装 首先假定你已经安装了 Node.js,接下来为你的应用创建一个目录,然后进入此目录并将其作为当前工作目录。...创建的最基本的web服务器 第五行中 '/',指的是根目录,可以理解为什么都没带,就比如我是8080端口打开,那么此时的地址栏为 http://localhost:8080/。...第九行中调用app.listen方法,启动服务器,是监听了port这个端口号,监听成功后执行回调。...代码示例 const express = require('express') const app = express() // => 在这里,调用 express.static() 方法,快速地对外提供静态资源...通过安装和配置cors中间件,可以很方便地解决跨域问题。

    2K42

    Web前端学习 第5章 node基础教程6 Koa基础

    然后通过app的listen方法设置监听端口,运行这个程序就可以移动一个koa服务器了。...console.log("server is running") 11 }); app的use方法可以调用一个函数(中间件),这个函数会在请求和相应之间被调用。...= "hello world" 7 await next(); 8 }) 9 10 app.use(async (ctx,next) => { 11 console.log("我是一个中间件...(3000,() => { 16 console.log("server is running") 17 }); 这样我们就可以实现一个有多个页面的应用程序了 五、静态文件 在网页中插入图片,需要在...web应用的服务器,只有静态文件目录的文件才可以被html页面直接访问。 也就是说,我们需要先创建一个静态文件目录,然后在里面放置图片(或js,或css),才能被html页面访问。

    36910

    XDM,JS如何函数式编程?看这就够了!(一)

    JS 就是轻量级的函数式编程! 拆解一下这句话,品味一下~ 本瓜将借助《JavaScript 轻量级函数式编程》一书带领你先透析它的落脚点函数式编程,然后再看看 JS 为什么被称为是 “轻量的”!...直到最近几年,函数式编程才成为整个开发界的主流观念。 函数式编程有完善且清晰的原则,一旦我们知道这些原则,我们将能更加快速地读懂代码,定位问题。这是为什么函数式编程重要的原因!...而声明式代码,以及我们努力遵循函数式编程原则所写出的代码,更专注于描述最终的结果。 函数式编程以另一种方式来思考代码应该如何组织才能使数据流更加明显,并能让读者很快理解你的思想。...后一个版本中的 return 表示一个显式输出,而前者的 y 赋值是一个隐式输出。 通常,开发人员喜欢显式模式而不是隐式模式。 为什么说后者 return 出来的就是显式的?...这不需要理由。 感谢阅读 我是掘金安东尼,公众号【掘金安东尼】,关注前端,也关注生活,持续输出ing......

    43630

    几种常见的跨域解决方法

    咱就这么想,服务器返回的数据是需要被解析的,那么就让服务器返回数据时调用一个函数,这个函数的形参就是服务器返回的数据(这个需要服务器配合的),所以我们指定一个query参数过去,让服务器去解析出需要调用的函数...3000端口,把3000端口当作一个转接器,从而得到数据这里的5000端口的express是我自己简单封装的一个类,不是express框架,所以写法有点不一样//5000端口服务器const express...3000端口是express框架,问我为啥5000不也用express框架写,那就是懒得写,因为5000端口是之前写的,我直接拿来用了//3000端口服务器const express = require...})()})app.listen(3000, (err) => { if (err) { return } console.log("服务器已经启动,端口3000...日常工作中,用得比较多的跨域方案是cors和Proxy代理服务器,Proxy主要就是利用同源策略对服务器不起作用。

    1.6K60

    真正的 Tornado 异步非阻塞

    Tronado 为协程实现了一套自己的协议,不能使用 Python 普通的生成器。...使用过 Python 生成器应该知道,想要启动生成器的话必须手动执行 next() 方法才行,所以这里的 coroutine 装饰器的其中一个作用就是在调用这个异步函数时候自动执行生成器。...所以在处理一些小负载的工作,是能起到很好的效果,让 Tornado 异步非阻塞的跑起来。...但是明明知道这个函数中做的是高负载的工作,那么你应该采用另一种方式,使用 Tornado 结合 Celery 来实现异步非阻塞。...基于 Celery 的异步编程 Celery 是一个简单、灵活且可靠的,处理大量消息的分布式系统,专注于实时处理的任务队列,同时也支持任务调度。

    4.1K60

    CentOS Linux中搭建Hadoop和Spark集群详解

    ,网上很多文章的教程中是没有的,这是因为这些端口默认就是8032、8031这样,感觉没有必要显式地再次配置。...我的理解是,因为在yarn-site.xml文件中没有显式地将这些端口配置出来的原因,导致子节点无法向主节点注册(Registered)——然后,从报错的信息看貌似是只要把8031端口配置上了就可以了,...其实也不是so easy的……如果不配置其他端口,则提交yarn任务的时候会无限地卡在ACCEPTED状态上,卡在该状态上的日志我看不出问题来,但是确实把上面的端口都配置了之后就好了。...因此,最好是将这些端口都显式配置好!!!...3) 至于SPARK_MASTER_HOST和SPARK_MASTER_PORT,感觉没有必要显式地配置,因为人家使用默认值也是没有问题的,但是我还是配上了,不配置的话会不会有问题我就不知道了。

    1.6K20

    厌倦了NullPointException?Optional拯救你!

    因此,你必须显式检测这个值是否存在,如果不存在就不能使用任何Option类型的操作符;这样由于Scala的类型系统,你永远也不会忘记对于空指针的检测。...Optional对象包含了一些方法来显式地处理某个值是存在还是缺失,Optional类强制你思考值不存在的情况,这样就能避免潜在的空指针异常。...值存在的时候进行进一步的操作 现在你有了一个Optional对象,你可以显式地处理值存在或者不存在的情况,再也不用想这样如履薄冰地进行空指针检测了: SoundCard soundcard = ...;...例如:你可能需要检测一个USB的端口是否是一个特定的版本;如果需要避免空指针异常,通畅的方式是检测非空然后调用getVersion方法,如下: USB usb = ...; if(usb !...为什么?

    1K20

    Data Binding 库使用的经验教训

    这样你就可以调用你的文本创建者类并使用内建 view binding: 这样我们可以从内建的绑定操作过程中提高效率,并且我们可以非常轻松地对创建格式化字符串的代码进行单元测试。...如果值实际发生了改变,我们才去调用 setMaxLines() 等方法。 编辑按: 感谢 Alexandre Gianquinto 在评论中提到『double parameters』功能。...好吧这确实有效,但是有一些需要注意的地方,这是由于『DB 库』的工作机制。...有种替代方法是在布局中显式声明 ViewState 中的每个变量,然后显式传递组合状态实例中的值,如下所示: 这显然会使开发人员维护和同步更多的代码,但它确实意味着『DB 库』可以优化去运行哪些表达式。...我个人一直在布局中使用单个变量,传入我的 ViewState 实例,并依赖于我们的视图绑定合理地运行。这就是为什么让视图绑定变得高效非常重要。

    42620

    CVE-2020-9971滥用XPC服务机制来提升macOS iOS中的特权

    0x0 简介 在这篇博客中,我将详细介绍我在管理XPC服务时,在launchd进程中发现的一个有趣的逻辑漏洞,它很容易被利用,并且100%稳定地获得macOS/iOS的高权限。..."只有拥有该域的进程才可以修改它。即使是root也不能这样做。" 这个假设是有道理的,因为一个进程域应该只有它的所有者进程才能使用。...activation count = 0 security context = { uid unset asid = 100000 } ... } 对于开发者来说,不需要显式的创建进程域...,也不需要将XPC服务添加到域中去,libxpc框架会隐式的为我们完成所有初始化阶段的工作。...在初始化阶段,libxpc框架会隐式的为我们做所有的工作,但是在libxpc.com中仍然有一个api xpc_add_bundles_for_domain。

    1.6K20

    提示 Data Binding 库使用的经验教训

    这样你就可以调用你的文本创建者类并使用内建 view binding: 这样我们可以从内建的绑定操作过程中提高效率,并且我们可以非常轻松地对创建格式化字符串的代码进行单元测试。...如果值实际发生了改变,我们才去调用 setMaxLines() 等方法。 编辑按: 感谢 Alexandre Gianquinto 在评论中提到『double parameters』功能。...好吧这确实有效,但是有一些需要注意的地方,这是由于『DB 库』的工作机制。...有种替代方法是在布局中显式声明 ViewState 中的每个变量,然后显式传递组合状态实例中的值,如下所示: 这显然会使开发人员维护和同步更多的代码,但它确实意味着『DB 库』可以优化去运行哪些表达式。...我个人一直在布局中使用单个变量,传入我的 ViewState 实例,并依赖于我们的视图绑定合理地运行。这就是为什么让视图绑定变得高效非常重要。

    69920

    C#规范整理·资源管理和序列化

    如果我们的类型使用到了非托管资源,或者需要显式地释放托管资源,那么就需要让类型继承接口IDisposable,这毫无例外。...这相当于告诉调用者:类型对象是需要显式释放资源的,你需要调用类型的Dispose方法。,一个标准的继承了IDisposable接口的类型应该像下面这样去实现。...注意2 如果调用者已经调用Dispose方法进行了显式地资源释放,那么,隐式释放资源(也就是终结器)就没有必要再运行了。...5.在Dispose模式中应区别对待托管资源和非托管资源# Dispose模式设计的思路基于:如果调用者显式调用了Dispose方法,那么类型就该按部就班地将自己的资源全部释放。...7.及时释放资源# 很多人会注意到:垃圾回收机制自动为我们隐式地回收了资源(垃圾回收器会自动调用终结器),于是不禁会问:为什么还要主动释放资源呢?

    28020
    领券