Javascript 使用 socket.io 聊天:我的代码不起作用,而老师的代码却起作用(看起来很相似)

Javascript chat using socket.io : my code doesn't work while teacher's does (seem a lot the same)

我正在学习 JS 课程,我不明白为什么我的代码不起作用,但老师的代码却起作用。这似乎是一个“行的顺序”问题,但我不确定也无法弄清楚。

更具体地说,不起作用的功能是聊天(套接字部分)。

这是有效的老师代码:

const express = require('express')
const session = require('express-session')
const MongoStore = require('connect-mongo')(session)
const flash = require('connect-flash')
const markdown = require('marked')
const app = express()
const sanitizeHTML = require('sanitize-html')

let sessionOptions = session({
  secret: "JavaScript is sooooooooo coool",
  store: new MongoStore({client: require('./db')}),
  resave: false,
  saveUninitialized: false,
  cookie: {maxAge: 1000 * 60 * 60 * 24, httpOnly: true}
})

app.use(sessionOptions)
app.use(flash())

app.use(function(req, res, next) {
  // make our markdown function available from within ejs templates
  res.locals.filterUserHTML = function(content) {
    return sanitizeHTML(markdown(content), {allowedTags: ['p', 'br', 'ul', 'ol', 'li', 'strong', 'bold', 'i', 'em', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6'], allowedAttributes: {}})
  }
  
  // make all error and success flash messages available from all templates
  res.locals.errors = req.flash("errors")
  res.locals.success = req.flash("success")

  // make current user id available on the req object
  if (req.session.user) {req.visitorId = req.session.user._id} else {req.visitorId = 0}
  
  // make user session data available from within view templates
  res.locals.user = req.session.user
  next()
})

const router = require('./router')

app.use(express.urlencoded({extended: false}))
app.use(express.json())

app.use(express.static('public'))
app.set('views', 'views')
app.set('view engine', 'ejs')

app.use('/', router)

const server = require('http').createServer(app)
const io = require('socket.io')(server)

io.use(function(socket, next) {
  sessionOptions(socket.request, socket.request.res, next)
})

io.on('connection', function(socket) {
  if (socket.request.session.user) {
    let user = socket.request.session.user

    socket.emit('welcome', {username: user.username, avatar: user.avatar})

    socket.on('chatMessageFromBrowser', function(data) {
      socket.broadcast.emit('chatMessageFromServer', {message: sanitizeHTML(data.message, {allowedTags: [], allowedAttributes: {}}), username: user.username, avatar: user.avatar})
    })
  }
})

module.exports = server

这是我的代码,看起来很相似但不起作用:

const express = require('express')
const session = require('express-session')
const MongoStore = require('connect-mongo')(session)
const flash = require('connect-flash')
const markdown = require('marked')
const sanitizeHTML = require('sanitize-html')
const app = express()

let sessionOptions = session({
    secret: "Javacsript is soooooooo coooooool",
    store: new MongoStore({client: require('./db')}),
    resave: false,
    saveUninitialized: false,
    cookie: {
        maxAge: 1000 * 60 * 60 * 24,
        httpOnly: true
    }
})

const router = require('./router')

app.use(sessionOptions)
app.use(flash())
app.use(function(req, res, next) {
    // Make our markdown function available from within ejs templates
    res.locals.filterUserHTML = function(content) {
        return sanitizeHTML(markdown(content), {allowedTags: ['p', 'br', 'ul', 'ol', 'li', 'bold', 'i', 'em', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6'], allowedAttributes: {}})
    }
    // Make all error and success flash messages available from all templates
    res.locals.errors = req.flash("errors")
    res.locals.success = req.flash("success")
    // Make user session data available from within view template
    res.locals.user = req.session.user
    // Make current user id available on the req object
    if (req.session.user) {req.visitorId = req.session.user._id} else {req.visitorId = 0}
    next()
})
// Add user submitted data to route
app.use(express.urlencoded({extended: false}))
app.use(express.json())

app.use('/', router)
app.use(express.static('public'))
// For views (1st arg), look into the folder 'views' (2nd arg)
app.set('views', 'views')
app.set('view engine', 'ejs')

const server = require('http').createServer(app)
const io = require('socket.io')(server)

io.use(function(socket, next) {
    sessionOptions(socket.request, socket.request.res, next)
})

io.on('connection', function(socket) {
    if (socket.request.session.user) {
        let user = socket.request.session.user

        socket.emit('welcome', {username: user.username, avatar: user.avatar})

        socket.on('chatMessageFromServer', function(data) {
            // Emit the event to all connected users except the one who sent it
            socket.broadcast.emit('chatMessageFromServer', {
                message: sanitizeHTML(data.message, {allowedTags: [], allowedAttributes: {}}), 
                username: user.username, 
                avatar: user.avatar})
        })
    }
})

module.exports = server

在此先感谢您的帮助。

您似乎错误地命名了侦听器。 (socket.on 函数)

chatMessageFromServer 应该是 chatMessageFromBrowser.