1

我的查询是:

db.Room.find({}, function (err, rooms) {
  if (!err) {
    async.each(rooms, function (room, done) {
      db.User.find({}, function (err, users) {
        if (err) {
          done(err)
        } else {
          room.users = users
          room._name = room.name
          done()
        }
      })
    }, function (err) {
      if (!err) {
        socket.emit('read:rooms', rooms)
      }
    })
  }
})

和模式是:

房间:

var mongoose = require('mongoose')
var Schema = mongoose.Schema,
  ObjectId = Schema.ObjectId;

var Room = new Schema({
  name: String
});

module.exports = Room

用户:

var mongoose = require('mongoose')
var Schema = mongoose.Schema,
  ObjectId = Schema.ObjectId;

var User = new Schema({
  email: String
});

module.exports = User

但在前端:

  socket.on('read:rooms', function (rooms) {
    $scope.rooms = rooms
  })

rooms没有users财产,请帮帮我

4

1 回答 1

4

这是因为Rooms模式没有users属性。

因此,有几种方法可以解决它。因为看起来您希望users属性实际上不是架构的一部分,并且是客户端连接而不是在数据库上完成的工作(这很好!),我建议当您通过套接字发送数据时,您将数据转换为只是普通的旧 JavaScript 对象(无论如何这都会发生,您只是早一点做)。

因此,当find返回时,它实际上是返回一个完全实现的 MongooseJS 模型对象。虽然您可以在对象实例上设置动态属性,但它们不是模型“数据”的一部分,因此当稍后将其序列化到客户端时,只有记录在案的属性才可用。

所以,这是我建议的一个例子:

db.Room.find({}, function (err, rooms) {
  if (!err) {
    var oRooms = [];
    async.each(rooms, function (room, done) {
      /* etc. your code */

       } else {
          var oRoom = room.toObject();
          oRoom.users = users
          oRoom._name = room.name
          oRooms.push(oRoom);
          done()
       }

该技术将使用模型的toObject 功能来返回 JavaScript 对象(不是 Mongoose 模型)。这样,您可以对对象做任何您想做的事情,包括动态添加新属性。

稍后,当然,确保将新的房间数组发送给客户端:

 if (!err) {
    socket.emit('read:rooms', oRooms)
 }
于 2013-11-05T17:48:52.437 回答