首页 > 解决方案 > 当我开始输入消息时节点服务器一直关闭

问题描述

我正在制作一个聊天应用程序,但是当我写消息并按发送时,我的节点服务器不断给我:

TypeError: Cannot read property 'trim' of undefined

或者

TypeError: Cannot read property 'room' of undefined

然后它崩溃了,我不知道为什么,其他一切都正常工作,只有服务器崩溃了。我试过自己修复它,但无济于事,没有服务器,您可能会猜到会发生什么。

这是代码:

index.js:


var express = require ('express')

var http = require ('http')

var { addUser, removeUser, getUser, getUsersInRoom } = require ('./user')


var router = require ('./router')

var { callbackify } = require('util')


var PORT = process.env.PORT || 5000


var app = express()

var server = http.createServer(app)

var io = require('socket.io')(server, {
  cors: {
    origin: '*',
  }
});

app.use(router)

io.on('connection', (socket) => {
    socket.on('join', ({ name, room }, callback) =>{
    var { error, user } = addUser({ id: socket.id, name, room })


    if(error) return callback(error)

    socket.emit('message', { user: 'admin', text: `Now, I- Oh, ${user.name}, welcome to room ${user.room},enjoy your time here!` })
    socket.broadcast.to(user.room).emit('message',{user: 'admin', text:`Hey, just coming in to say ${user.name} joined, also, how you guys doin.`})

    socket.join(user.room)

    callback()
  })

  socket.on('sendMessage', (message, callback) => {
    var user = getUser(socket.id)


    io.to(user.room).emit('message', { user: user.name, text: message })

    callback()
  })

    socket.on('disconnect', () => {
        console.log('Aw they left :(');

      });
  });

server.listen(PORT, () => console.log (`This is Index, port ${PORT} secured, lots of unfixable bug`))

user.js(存在问题的地方):

const users = []

const addUser = ({ id, name, room }) =>{
  name = name.trim().toLowerCase()
  room = room.trim().toLowerCase()

  const existingUser = users.find((user) => user.room === room && user.name === name)

  if(existingUser){
      return {error: 'Username is already taken you dumbass'}
  }

  const user = {id, name, room}

  users.push(user);

  return{ user }
}
const removeUser = (id) =>{
  const index = users.findIndex ((user) => user.id === id)

if(index !== -1) {
    return users.splice(index, 1)[0]
}
}

const getUser = (id) => users.find((user) => user.id === id)

const getUsersInRoom = (room) => users.filter((user) => user.room === room)

module.exports = { addUser, removeUser, getUser, getUsersInRoom }

router.js

const express = require('express')
const router = express.Router();

router.get('/*', (req,res) =>{
    res.send(`Server is up and running`)
})

module.exports = router;

这是所有服务器文件,因为问题来自服务器,而不是客户端(这里没有足够的单词,所以我必须这样做)提前谢谢!

标签: javascriptnode.jsservercrash

解决方案


这两个错误都是由于应用程序试图访问未定义值的子函数/子参数。

您确定客户端在发出“加入”时发送了正确的参数吗?您可以在服务器端做一些验证并检查其是否未定义,如果是则设置默认值。

name = name ? name.trim().toLowerCase() : "default_name";
room = room ? room.trim().toLowerCase() : "default_room";

至于未定义错误的房间很可能是由于应用程序的这一部分

const existingUser = users.find((user) => user.room === room && user.name === name)

尝试检查 users.length 是否为 0,如果它为 0 则不要打扰 .find(),或者您可以在 .find() 函数中添加验证以检查用户是否未定义,然后返回 false;

const existingUser = users.find((user) => user && user.room === room && user.name === name)

推荐阅读