《Node.js 实战》聊天室版本问题解决方案(第2章)

本文主要分享在学习Node.js过程中遇到的老版图书代码与新版API不匹配的问题,涉及两个错误:TypeError: fn.bind is not a function和TypeError: Cannot read property 'rooms' of undefined。针对这两个问题,分别给出了Stack Overflow上的解决方案,并提醒了一个非BUG问题,关于文件操作的注意事项,避免使用existsSync检查文件可访问性,而应直接尝试打开/读取/写入并处理错误。
摘要由CSDN通过智能技术生成

  最近开始学习 Node.js,可是目前 Node.js 不错的入门书都是出版很久的了,书中讲的库已经有部分 API 遗弃,导致我们在敲源码的时候会遇到各种问题,下面是我在跟着《Node.js 实战》的多房间聊天室程序时遇到的版本问题,在这里做个分享~

BUG 1:TypeError: fn.bind is not a function


错误指向的代码是 chat_server.js 中的这一行:

var usersInRoom = io.sockets.clients(room);
解决方案1

代码改成:

var usersInRoom = io.of('/').in(room).clients

https://stackoverflow.com/questions/43528836/typeerror-fn-bind-is-not-a-function

解决方案2

代码改成:

var usersInRoom = io.sockets.adapter.rooms[room]

https://stackoverflow.com/questions/9352549/getting-how-many-people-are-in-a-chat-room-in-socket-io


Bug 2:TypeError: Cannot read property ‘rooms’ of undefined


chat_server.js 中的这一行:

socket.emit('rooms', io.sockets.manager.rooms)
解决方案

代码改成:

socket.emit('rooms', io.sockets.adapter.rooms)


还有一个不是 BUG 的问题


  这个问题不会导致BUG,是 server.js 文件中的 serverStatic 函数

原写法:

function serveStatic(response, cache, absPath) {
  if (cache[absPath]) {
    sendFile(response, absPath, cache[absPath]);
  } else {
    fs.exists(absPath, function(exists) {
      if (exists) {
        fs.readFile(absPath, function(err, data) {
          if (err) {
            send404(response);
          } else {
            cache[absPath] = data;
            sendFile(response, absPath, data);
          }
        });
      } else {
        send404(response);
      }
    });
  }
}

不过 fs.exists() 已经被遗弃了,被 fs.stat()fs.access() 替代了,且官方在手册这样写:

不建议在调用 fs.open()fs.readFile()fs.writeFile() 之前使用 fs.access() 检查一个文件的可访问性。 如此处理会造成紊乱情况,因为其他进程可能在两个调用之间改变该文件的状态。 所以,用户代码应该直接打开/读取/写入文件,当文件无法访问时再处理错误。

故代码应该改成这样:

function serveStatic(res, cache, absPath) {
  if(cache[absPath]) {
    sendFile(res, absPath, cache[absPath])
  } else {
    fs.readFile(absPath, function(err, data) {
      if(err) {
        send404(res)
      } else {
        cache[absPath] = data
        sendFile(res, absPath, data)
      }
    })
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值