上一篇说了下《Node.js 实战》第二章中聊天室程序的版本问题,再往下跟代码同样也发现了许多版本问题,就在这里一起列一下。
只会列每一章中较长的代码事例中出现的问题,其他短的代码或者我没有列出来的,可以留言大家一起讨论~
ps:同名的书很多,是 TJ大神这本
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"
自动设置了一个监听器
右侧两个窗口可以发信息,就是一个简易聊天室
第三行的
var channel = new events.EventEmitter();
可以直接写为
var channel = new events();
EventEmitter 类
这里代码没问题,重点是想要看到效果需要做的操作,书中说的不够清晰,初次上手的时候也懵逼了一段时间
1.用 Node 运行脚本(比如我的脚本叫做 server.js
)
node server.js
2.将脚本文件(即 server.js)放到 watch 文件夹中
3.效果:watch 文件夹中脚本文件被移到 done 文件夹下,且文件名被改为小写;
是关于 util.inherit()
的,官方手册更加推荐使用 ES6
的 class
和 extend
关键词,有兴趣的可以移步 这里
错误提示指向
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 源的结构:
第二个 RSS 源的结构:
问题点同 代码清单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)
书少了对 authenticateWithDatabase()
的定义,在程序加上下面的代码
function authenticateWithDatabase(user, pass, callback) {
var err;
if (user != 'tobi' || pass != 'ferret') {
err = new Error('Unauthorized');
}
callback(err);
}
(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(":")