最近开始学习 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)
}
})
}
}