《Node.js 实战》版本问题解决方案(第3-6章)

  上一篇说了下《Node.js 实战》第二章中聊天室程序的版本问题,再往下跟代码同样也发现了许多版本问题,就在这里一起列一下。

只会列每一章中较长的代码事例中出现的问题,其他短的代码或者我没有列出来的,可以留言大家一起讨论~

ps:同名的书很多,是 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" 自动设置了一个监听器

效果:
《Node.js 实战》版本问题解决方案(第3-6章)_第1张图片

右侧两个窗口可以发信息,就是一个简易聊天室

不是BUG的问题

第三行的

var channel = new events.EventEmitter();

可以直接写为

var channel = new events();

EventEmitter 类


代码清单 3-13 扩展事件发射器的功能

事例无效果问题

这里代码没问题,重点是想要看到效果需要做的操作,书中说的不够清晰,初次上手的时候也懵逼了一段时间

1.用 Node 运行脚本(比如我的脚本叫做 server.js

node server.js

2.将脚本文件(即 server.js)放到 watch 文件夹中
3.效果:watch 文件夹中脚本文件被移到 done 文件夹下,且文件名被改为小写;

不是BUG的问题

是关于 util.inherit() 的,官方手册更加推荐使用 ES6classextend 关键词,有兴趣的可以移步 这里


代码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 源的结构:

《Node.js 实战》版本问题解决方案(第3-6章)_第2张图片

第二个 RSS 源的结构:

《Node.js 实战》版本问题解决方案(第3-6章)_第3张图片

第五章


代码清单5-19 用Redis的发布/预订功能实现的简单聊天服务器

bug1 TypeError: Cannot read property ‘publish’ of undefined

  问题点同 代码清单3-11net.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(":")

你可能感兴趣的:(Node.js,读书笔记)