《Node.js 实战》版本问题解决方案(第3-6章) - 日理万妓 2022-05-17 05:49 174阅读 0赞 上一篇说了下《Node.js 实战》第二章中聊天室程序的版本问题,再往下跟代码同样也发现了许多版本问题,就在这里一起列一下。 > 只会列每一章中较长的代码事例中出现的问题,其他短的代码或者我没有列出来的,可以留言大家一起讨论~ > > ps:同名的书很多,是 [TJ大神这本][TJ] ### 第三章 ### -------------------- #### 代码清单3-11 用事件发射器实现的简单的发布/预订系统 #### ##### bug1 程序无效果 ##### var server = net.createServer(function(client) { var id = client.remoteAddress + ":" + client.remotePort client.on("connect", function() { channel.emit('join', id, client) }) client.on("data", function(data) { data = data.toString() channel.emit("broadcast", id, data) }) }) 改成 var server = net.createServer(function(client) { var id = client.remoteAddress + ":" + client.remotePort channel.emit('join', id, client) client.on("data", function(data) { data = data.toString() channel.emit("broadcast", id, data) }) }) > [net.createServer][] 的回调函数已为 `"connection"` 自动设置了一个监听器 效果: ![这里写图片描述][70] 右侧两个窗口可以发信息,就是一个简易聊天室 ##### 不是BUG的问题 ##### 第三行的 var channel = new events.EventEmitter(); 可以直接写为 var channel = new events(); > [EventEmitter 类][EventEmitter] #### 代码清单 3-13 扩展事件发射器的功能 #### ##### 事例无效果问题 ##### 这里代码没问题,重点是想要看到效果需要做的操作,书中说的不够清晰,初次上手的时候也懵逼了一段时间 1.用 Node 运行脚本(比如我的脚本叫做 `server.js`) node server.js 2.将脚本文件(即 server.js)放到 watch 文件夹中 3.效果:watch 文件夹中脚本文件被移到 done 文件夹下,且文件名被改为小写; ##### 不是BUG的问题 ##### 是关于 `util.inherit()` 的,官方手册更加推荐使用 `ES6` 的 `class` 和 `extend` 关键词,有兴趣的可以移步 [这里][Link 1] #### 代码3-17 在一个简单的程序中实现串行性流程控制 #### ##### bug 1 TypeError: Cannot read property ‘length’ of undefined ##### 错误提示指向 if(!handler.dom.items.length) return next(new Error('No RSS items found')) 这里代码没错(虽然 htmlparser 够老,已经5年没更新了),这里应该是第一个 RSS 预订源改了结构。 在 `parseRSSFeed` 函数中,在调用 `handler.dom.items.length` 前,将 `handler` 打印出来可以发现第一个 RSS 源的结构没有 `handler.dom.items`,所以它才会报错。 这里我没给什么解决方案,因为只看第二个也能看到效果,如果你真的想看完全的,那就自己加些条件判定什么的手段吧。 第一个 RSS 源的结构: ![这里写图片描述][70 1] 第二个 RSS 源的结构: ![这里写图片描述][70 2] ### 第五章 ### -------------------- #### 代码清单5-19 用Redis的发布/预订功能实现的简单聊天服务器 #### ##### bug1 TypeError: Cannot read property ‘publish’ of undefined ##### 问题点同 `代码清单3-11`, `net.createServer()` 的回调函数已为 `"connection"` 自动设置了一个监听器,所以回调函数中再设一个 `connect` 是没用的 程序的完整代码是这样的: //用Redis发布\预订功能实现的简单聊天服务器 var net = require('net') var redis = require('redis') //为每个连接到聊天服务器上的用户定义设置逻辑 var server = net.createServer((socket) => { var subscriber = redis.createClient(), publisher = redis.createClient() //为用户创建预订客户端 subscriber.subscribe('main_chat_room') //信道收到信息后,把它发给用户 subscriber.on('message', (channel, message) => { socket.write('Channel ' + channel + ': ' + message) }) //用户输入消息后发布它 socket.on('data', (data) => { publisher.publish('main_chat_room', data) }) //如果用户断开连接,终止客户端连接 socket.on('end', () => { subscriber.unsubscribe('main_chat_room') subscriber.end() publisher.end() }) }) server.listen(3000) ### 第六章 ### -------------------- #### 代码清单6-6 实现HTTP Basic认证的中间件组件 #### ##### bug1 ReferenceError: authenticateWithDatabase is not defined ##### 书少了对 `authenticateWithDatabase()` 的定义,在程序加上下面的代码 function authenticateWithDatabase(user, pass, callback) { var err; if (user != 'tobi' || pass != 'ferret') { err = new Error('Unauthorized'); } callback(err); } ##### bug2 ##### (node:30752) [DEP0005] DeprecationWarning: Buffer() is deprecated due to security and usability issues. Please use the Buffer.alloc(), Buffer.allocUnsafe(), or Buffer.from() methods instead node 已经废除了 `new Buffer()` var auth = new Buffer(parts[1], 'base64').toString().split(":“) 改成 var auth = Buffer.from(parts[1], 'base64').toString().split(":") [TJ]: https://book.douban.com/subject/25870705/ [net.createServer]: http://nodejs.cn/api/net.html#net_net_createserver_options_connectionlistener [70]: /images/20220517/6ccecfa0daa04701a6a735aebb190b97.png [EventEmitter]: http://nodejs.cn/api/events.html#events_class_eventemitter [Link 1]: http://nodejs.cn/api/util.html#util_util_inherits_constructor_superconstructor [70 1]: /images/20220517/c3d3cce7292540bfa0553775b388f553.png [70 2]: /images/20220517/e1bf97423c2b415389126291949fb3e4.png
相关 Java反射机制实战:问题与解决方案 在Java中,反射是一个强大的工具,它允许我们在运行时检查类、字段和方法。以下是一些常见的问题以及相应的解决策略: 1. **获取类**: - 问题:无法获取到某个类。 深碍√TFBOYSˉ_/ 2024年09月06日 07:21/ 0 赞/ 53 阅读
相关 nacos原理和实战问题解决方案 nacos原理和集群搭建实战,在开始之前、我们先要知道nacos的官网并熟悉其基本特性 [官网介绍][Link 1] 一、原理: 1、多种注册中心对比 ![37eb1d 淩亂°似流年/ 2023年10月03日 23:26/ 0 赞/ 22 阅读
相关 第11章 hive常见错误及解决方案 1)SecureCRT 7.3出现乱码或者删除不掉数据,免安装版的SecureCRT 卸载或者用虚拟机直接操作或者换安装版的SecureCRT 2)连接不上mysql数据库 灰太狼/ 2022年12月27日 07:37/ 0 赞/ 206 阅读
相关 nodejs 安装 报错解决方案 nodejs 安装 报错解决方案 参考文章: [(1)nodejs 安装 报错解决方案][1_nodejs _] (2)https://www.cnblogs.com/S 分手后的思念是犯贱/ 2022年09月05日 01:51/ 0 赞/ 273 阅读
相关 《Node.js 实战》聊天室版本问题解决方案(第2章) 最近开始学习 Node.js,可是目前 Node.js 不错的入门书都是出版很久的了,书中讲的库已经有部分 API 遗弃,导致我们在敲源码的时候会遇到各种问题,下面是我在跟 旧城等待,/ 2022年05月18日 10:43/ 0 赞/ 152 阅读
相关 《Node.js 实战》版本问题解决方案(第3-6章) 上一篇说了下《Node.js 实战》第二章中聊天室程序的版本问题,再往下跟代码同样也发现了许多版本问题,就在这里一起列一下。 > 只会列每一章中较长的代码事例中出现的问题 - 日理万妓/ 2022年05月17日 05:49/ 0 赞/ 175 阅读
相关 Storm实战常见问题及解决方案 [http://blog.sina.com.cn/s/blog\_8c243ea30101k0k1.html][http_blog.sina.com.cn_s_blog_8c2 我就是我/ 2022年04月03日 05:39/ 0 赞/ 470 阅读
相关 【RocketMq实战第九篇】-不同场景解决方案 前言 RocketMQ完结篇,主要使用消息队列处理一些业务场景。 正文 顺序消息 顺序消息分为全局顺序消息和部分顺序消息。 全局顺序消息指某个 Topic 超、凢脫俗/ 2022年03月22日 16:06/ 0 赞/ 254 阅读
相关 linux安装nodejs不是最新版本的解决方案(如何安装指定版本nodejs) 遇见问题: 执行 yum install nodejs 时,是老版本,而不是新版本。 并且变更源无效(示例代码如下,这个是centos装8.x版本的nodejs) 比眉伴天荒/ 2022年03月18日 13:22/ 0 赞/ 690 阅读
还没有评论,来说两句吧...