Node.js语法错误求助:Unexpected token异常原因排查
解决Node.js中Object.entries循环的Unexpected token语法错误
我一眼就揪出了导致你这个语法报错的核心问题,顺便也帮你整理了代码里其他几个影响运行的小bug,一起来看:
1. 触发Unexpected token .的根本原因
你代码里的两处Object.entries(sockets).forEach(([key, cs])) => {都犯了同一个低级语法错误:箭头函数的参数列表后面多写了一个右括号。
正确的箭头函数解构参数写法应该是:
Object.entries(sockets).forEach(([key, cs]) => {
你多写的那个额外)会让JavaScript解析器误以为箭头函数的定义已经结束,后面的=>就成了完全无法识别的意外标记,直接抛出语法错误。
2. 其他需要修正的代码问题
除了这个核心错误,你的代码还有几个逻辑/语法小问题:
- 代码顺序混乱:你把服务器初始化
const server = require('net').createServer();和清屏代码放在了forEach循环内部,这会导致每次循环都重新创建服务器,完全不符合聊天服务器的逻辑,必须把这些初始化代码放在最外层。 - 模板字符串语法错误:
$[socket.name}应该改成${socket.name},模板字符串的变量插值要用${}而非$[]。 - 无效的判断逻辑:
if(!socket[socket.id])是错误的写法,你想要判断的是客户端是否已经设置了名称,应该改成if(!socket.name)。
修正后的完整代码
const server = require('net').createServer(); // 先初始化服务器 let counter = 0; let sockets = {}; server.on('connection', socket => { socket.id = counter++; console.log('Client is connected!'); socket.write('Hi, your name?\n'); socket.on('data', data => { if(!socket.name) { socket.name = data.toString().trim(); socket.write(`Welcome ... ${socket.name}!\n`); sockets[socket.id] = socket; return; } // 修正后的forEach循环 Object.entries(sockets).forEach(([key, cs]) => { if (socket.id == key) return; cs.write(`${socket.name}: `); cs.write(data); }); }); socket.on('end', () => { delete sockets[socket.id]; console.log('Client is now disconnected'); }); }); // 可以把清屏代码放在合适的地方,比如服务器启动时 process.stdout.write('\u001B[2J\u001B[0;0f'); // 记得加上服务器监听的代码,比如: // server.listen(3000, () => { // console.log('Chat server running on port 3000'); // });
内容的提问来源于stack exchange,提问作者Stan Alam




