我在我的应用程序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')
})
})
}
你有任何解释吗?您还需要更多信息吗?
答案 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的问题,我无法提供,因为你提供的代码不够