【问题标题】:Socket.io is closed before the connection is establishedSocket.io 在连接建立之前关闭
【发布时间】:2017-12-23 17:38:52
【问题描述】:

我在我的应用程序 mongoose.js 和 socket.io 中使用。我尝试在猫鼬回调中发出一个事件。但我的客户(角度)似乎没有收到任何东西。此外,每次在服务器端、回调和“用户”数据中发出事件时,它都会不断断开连接。

确切地说,我的 User 模型以以下方式包装:

const mongoose = require('mongoose')

class DBReader {

    constructor(name, schema) {
        this.Model = require(`./models/${name}`)
    }

    find(params, callback) {
        this.Model.find(params, callback)
    }

    findOne(params, callback) {
        this.Model.findOne(params, callback)
    }

    findById(id, callback) {
        this.Model.findById(id, callback)
    }
}

module.exports = DBReader

我像这样实例化我的用户:

const User = new DBReader('user')

以下代码有效,也就是说我的客户端没有断开连接并接收两个事件(它有效,因为我没有在回调中发出“用户”数据)...

function socket(httpServer) {

  const io = require('socket.io')(httpServer)

  io.on('connection', socket => {
    console.log('User connected')

    socket.emit('hello', 'Hello World !')

    User.findOne({}, (err, user) => {
      console.log(err)
      console.log(user) // Displays the requested user
    })

    socket.emit('hello', 'Wooorld !')

    socket.on('disconnect', () => {
      console.log('User disconnected')
    })
  })
}

此代码也有效(因为我不发出“用户”数据)。

function socket(httpServer) {

  const io = socketio(httpServer)

  io.on('connection', socket => {
    console.log('User connected')

    socket.emit('hello', 'Hello World !')

    User.findOne({}, (err, user) => {
      console.log(err)
      console.log(user)
      socket.emit('hello', 'hellooo !')
    })

    socket.emit('hello', 'Wooorld !')

    socket.on('disconnect', () => {
      console.log('User disconnected')
    })
  })
}

但此代码不起作用(在回调中使用“用户”数据发出的事件)...

function socket(httpServer) {

  const io = socketio(httpServer)

  io.on('connection', socket => {
    console.log('User connected')

    socket.emit('hello', 'Hello World !')

    User.findOne({}, (err, user) => {
      console.log(err)
      console.log(user)
      socket.emit('hello', user)
    })

    socket.emit('hello', 'Wooorld !')

    socket.on('disconnect', () => {
      console.log('User disconnected')
    })
  })
}

你有什么解释吗?您需要更多信息吗?

【问题讨论】:

  • 您在 Angular 中使用了哪个 socket.io 模块?
  • socket.io-client
  • 我现在想知道我的问题是否来自我尝试发送的对象类型。我认为 socket.io 完成了所有工作,但如果我的用户不是有效的 JSON 字符串怎么办?
  • 是的,我猜你的用户对象有问题!在您发出之前,您是否使用 console.log(user) 正确获取了您的对象?
  • 如果客户端断开连接,我会假设服务器正在抛出错误。

标签: node.js angular mongoose socket.io


【解决方案1】:

您只能发出可以通过JSON.stringify 字符串化的内容(-> 没有循环引用)。当您尝试发送整个 mongooseDocument 时,这将失败。

您可以执行mongooseModel.find({...}).lean().exec(function callback(err, user){...}),它将返回一个普通的javascript对象而不是mongooseDocument(可以序列化),或者您可以使用mongoose.toJSON method自行转换。

关于 socket.io/angular 的问题,由于您提供的代码不足,我无能为力

【讨论】:

    【解决方案2】:

    我找到了答案-_-!

    实际上,我无法发送口音(é、è、à...)。那是因为我的客户端 socket.io 包比服务器端包旧(1.7.? 对 2.0.3)。

    我希望这个答案至少能帮助下一个人尝试发出带有重音的对象...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-13
      • 2021-05-29
      • 2018-02-05
      • 2015-01-08
      • 2018-06-24
      • 2019-12-14
      • 1970-01-01
      相关资源
      最近更新 更多