Socket.io在建立连接之前关闭

时间:2017-07-18 17:47:44

标签: node.js angular mongoose socket.io

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

准确地说,我的用户模型以下列方式包装:

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')
    })
  })
}

但是这段代码不起作用(使用'user'数据回调中发出的事件)......

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')
    })
  })
}

你有任何解释吗?您还需要更多信息吗?

2 个答案:

答案 0 :(得分:2)

我找到了答案-_-!

实际上,事实证明我无法发送重音符号(é,è,à...)。这是因为我的客户端socket.io包比服务器端更旧(1.7。?对2.0.3)。

我希望这个答案至少可以帮助下一个尝试用重音释放对象的人......

答案 1 :(得分:0)

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

你可以做一个mongooseModel.find({...}).lean().exec(function callback(err, user){...}),它会返回一个简单的javascript对象而不是mongooseDocument(可以序列化),或者你可以使用mongoose.toJSON method自己转换它。

关于socket.io/angular的问题,我无法提供,因为你提供的代码不够