You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动