Node.js 使用mongoose查询两个用户之间的消息历史记录的建议

Node.js 使用mongoose查询两个用户之间的消息历史记录的建议,node.js,mongodb,mongoose,messaging,Node.js,Mongodb,Mongoose,Messaging,如何获取非当前登录用户的_id并将其用于查询条件 我目前正在尝试从用户数据库获取消息。 对于_id,我尝试使用ajaxget请求并将id作为req主体的数据传入。从一些研究中,我发现将数据传递给get请求是一个坏主意。 为什么?如果HTTP方法不能有实体体,例如GET,那么数据会附加到URL(“我尝试在Yikes之后从URL获取id”)。在URL中包含用户数据可能会产生各种后果。 模式: const userSchema = new Schema({ messages:[{ typ

如何获取非当前登录用户的_id并将其用于查询条件

我目前正在尝试从用户数据库获取消息。 对于_id,我尝试使用ajaxget请求并将id作为req主体的数据传入。从一些研究中,我发现将数据传递给get请求是一个坏主意。 为什么?如果HTTP方法不能有实体体,例如GET,那么数据会附加到URL(“我尝试在Yikes之后从URL获取id”)。在URL中包含用户数据可能会产生各种后果。

模式:

const userSchema = new Schema({
  messages:[{
    type: Schema.Types.ObjectId,
    ref: "Message"
  }]
});

const messageSchema = new Schema({
  content: {
    type: String,
    require: True,
  },
  sender: {
    type: Schema.Types.ObjectId,
    ref: "User"
  },
  receiver:{
    type: Schema.Types.ObjectId,
    ref: "User"
  },
  creation_date:{
    type: Date,
    default: Date.now
  }
});
chatHistory.js:

      $.ajax({
        type: 'GET',
        url: "/chatHistory"
      }).then(function(data) {
        if (data.length <= 0) {
          //if no data
          console.log('no DATA');
        }
        data.forEach(function(element) {
          //do something with data
        });
      });
我能够通过post请求成功地将id存储到route.js文件中的一个变量中。现在,我正在处理查询参数,以便只显示在get请求中发送给特定用户的消息

工作代码

router.route('/messages')
  .get(function(req, res) {
    var current_date = new Date();
    User.findOne({
      username: req.user.username
    }).populate(
      'follow'
    ).populate(
      'following'
    ).exec(function(err, user) {
      if (!err) {
        res.render("messages", {
          user: user,
          currentUserName: req.user.name,
          creationDate: getCreationTimeString(current_date, req.user.creation_date)
        });
      } else {
        console.log(err);
      }
    });
  })
  .post(function(req, res) {
    var currentUserName = req.user ? req.user.name : "Annonomous";
    if (currentUserName === "Annonomous") {
      res.redirect("/account");
    }
    var r_id = mongoose.Types.ObjectId(req.body.receiver_id);
    console.log(req.body.receiver_id, " before", r_id, " after");
    const message = new Message({
      content: req.body.content,
      sender: req.user._id,
      receiver: req.body.r_id, //<- THE ERROR
      creation_date: new Date()
    });

    message.save(function(err) {
      if (err) {
        console.log(err);
      } else {
        console.log("Saving Message");
      }
    });

    User.updateOne({
      "_id": req.user._id
    }, {
      $push: {
        "messages": message,
      }
    }, function(err) {
      if (err) {
        console.log(err);
      }
    });
  });

router.route('/messages')
  .get(function(req, res) {
    var current_date = new Date();
    User.findOne({
      username: req.user.username
    }).populate(
      'follow'
    ).populate(
      'following'
    ).exec(function(err, user) {
      if (!err) {
        res.render("messages", {
          user: user,
          currentUserName: req.user.name,
          creationDate: getCreationTimeString(current_date, req.user.creation_date)
        });
      } else {
        console.log(err);
      }
    });
  })
  .post(function(req, res) {
    var currentUserName = req.user ? req.user.name : "Annonomous";
    if (currentUserName === "Annonomous") {
      res.redirect("/account");
    }
    const message = new Message({
      content: req.body.content,
      sender: req.user._id,
      receiver: req.body.receiver_id,
      creation_date: new Date()
    });

    message.save(function(err) {
      if (err) {
        console.log(err);
      } else {
        console.log("Saving Message");
      }
    });

    User.updateOne({
      "_id": req.user._id
    }, {
      $push: {
        "messages": message,
      }
    }, function(err) {
      if (err) {
        console.log(err);
      }
    });
  });

let receiver_id;
let mA;
let mB;

router.route('/chatHistory')
  .get(function(req, res) {
    async.parallel({
      messagesAFind: function(callback) {
        User.findOne({
          _id: req.user._id
        }).populate({
          path: 'messages',
          match: {
            'receiver': receiver_id
          }
        }).exec(function(err, userA) {
          if (err) return callback(err);
          mA = userA.messages;
          callback();
        });
      },
      messagesBFind: function(callback) {
        User.findOne({
          _id: receiver_id
        }).populate({
          path: 'messages',
          match: {
            'receiver': req.user._id
          }
        }).exec(function(err, userB) {
          if (err) return callback(err);
          mB = userB.messages;
          callback();
        });
      }
    }, function(err) {
        if (err) return next(err);
        console.log(mA);
        console.log(mB);
        var allMessages = [];
        allMessages.push(mA,mB);
        res.json(allMessages);
    });
  })
  .post(function(req, res) {
    if (req.body.str === "getChatHistory") {
      receiver_id = req.body.id;
    }
  });
chatHistory.js

$.ajax({
  type: 'POST',
  url: "/chatHistory",
  data: dataToBeSent,
  dataType: "json"
}).done(function(msg) {
  console.log("Data Saved: " + msg);
}).fail(function(msg) {
  console.log("Fail! " + msg.data);
});

$.ajax({
  type: 'GET',
  url: "/chatHistory",
}).then(function(data) {
  if (data.length <= 0) {
    console.log("no data");
  } else {
    data = data.reverse();
    data.forEach(function(element) {
      console.log(element);
    });
  }
});

主要问题是我是如何创建消息的。我存储的是一个不同于接收者的id

旧代码

router.route('/messages')
  .get(function(req, res) {
    var current_date = new Date();
    User.findOne({
      username: req.user.username
    }).populate(
      'follow'
    ).populate(
      'following'
    ).exec(function(err, user) {
      if (!err) {
        res.render("messages", {
          user: user,
          currentUserName: req.user.name,
          creationDate: getCreationTimeString(current_date, req.user.creation_date)
        });
      } else {
        console.log(err);
      }
    });
  })
  .post(function(req, res) {
    var currentUserName = req.user ? req.user.name : "Annonomous";
    if (currentUserName === "Annonomous") {
      res.redirect("/account");
    }
    var r_id = mongoose.Types.ObjectId(req.body.receiver_id);
    console.log(req.body.receiver_id, " before", r_id, " after");
    const message = new Message({
      content: req.body.content,
      sender: req.user._id,
      receiver: req.body.r_id, //<- THE ERROR
      creation_date: new Date()
    });

    message.save(function(err) {
      if (err) {
        console.log(err);
      } else {
        console.log("Saving Message");
      }
    });

    User.updateOne({
      "_id": req.user._id
    }, {
      $push: {
        "messages": message,
      }
    }, function(err) {
      if (err) {
        console.log(err);
      }
    });
  });

router.route('/messages')
  .get(function(req, res) {
    var current_date = new Date();
    User.findOne({
      username: req.user.username
    }).populate(
      'follow'
    ).populate(
      'following'
    ).exec(function(err, user) {
      if (!err) {
        res.render("messages", {
          user: user,
          currentUserName: req.user.name,
          creationDate: getCreationTimeString(current_date, req.user.creation_date)
        });
      } else {
        console.log(err);
      }
    });
  })
  .post(function(req, res) {
    var currentUserName = req.user ? req.user.name : "Annonomous";
    if (currentUserName === "Annonomous") {
      res.redirect("/account");
    }
    const message = new Message({
      content: req.body.content,
      sender: req.user._id,
      receiver: req.body.receiver_id,
      creation_date: new Date()
    });

    message.save(function(err) {
      if (err) {
        console.log(err);
      } else {
        console.log("Saving Message");
      }
    });

    User.updateOne({
      "_id": req.user._id
    }, {
      $push: {
        "messages": message,
      }
    }, function(err) {
      if (err) {
        console.log(err);
      }
    });
  });

let receiver_id;
let mA;
let mB;

router.route('/chatHistory')
  .get(function(req, res) {
    async.parallel({
      messagesAFind: function(callback) {
        User.findOne({
          _id: req.user._id
        }).populate({
          path: 'messages',
          match: {
            'receiver': receiver_id
          }
        }).exec(function(err, userA) {
          if (err) return callback(err);
          mA = userA.messages;
          callback();
        });
      },
      messagesBFind: function(callback) {
        User.findOne({
          _id: receiver_id
        }).populate({
          path: 'messages',
          match: {
            'receiver': req.user._id
          }
        }).exec(function(err, userB) {
          if (err) return callback(err);
          mB = userB.messages;
          callback();
        });
      }
    }, function(err) {
        if (err) return next(err);
        console.log(mA);
        console.log(mB);
        var allMessages = [];
        allMessages.push(mA,mB);
        res.json(allMessages);
    });
  })
  .post(function(req, res) {
    if (req.body.str === "getChatHistory") {
      receiver_id = req.body.id;
    }
  });
并行获取两个用户之间的所有消息

工作代码

router.route('/messages')
  .get(function(req, res) {
    var current_date = new Date();
    User.findOne({
      username: req.user.username
    }).populate(
      'follow'
    ).populate(
      'following'
    ).exec(function(err, user) {
      if (!err) {
        res.render("messages", {
          user: user,
          currentUserName: req.user.name,
          creationDate: getCreationTimeString(current_date, req.user.creation_date)
        });
      } else {
        console.log(err);
      }
    });
  })
  .post(function(req, res) {
    var currentUserName = req.user ? req.user.name : "Annonomous";
    if (currentUserName === "Annonomous") {
      res.redirect("/account");
    }
    var r_id = mongoose.Types.ObjectId(req.body.receiver_id);
    console.log(req.body.receiver_id, " before", r_id, " after");
    const message = new Message({
      content: req.body.content,
      sender: req.user._id,
      receiver: req.body.r_id, //<- THE ERROR
      creation_date: new Date()
    });

    message.save(function(err) {
      if (err) {
        console.log(err);
      } else {
        console.log("Saving Message");
      }
    });

    User.updateOne({
      "_id": req.user._id
    }, {
      $push: {
        "messages": message,
      }
    }, function(err) {
      if (err) {
        console.log(err);
      }
    });
  });

router.route('/messages')
  .get(function(req, res) {
    var current_date = new Date();
    User.findOne({
      username: req.user.username
    }).populate(
      'follow'
    ).populate(
      'following'
    ).exec(function(err, user) {
      if (!err) {
        res.render("messages", {
          user: user,
          currentUserName: req.user.name,
          creationDate: getCreationTimeString(current_date, req.user.creation_date)
        });
      } else {
        console.log(err);
      }
    });
  })
  .post(function(req, res) {
    var currentUserName = req.user ? req.user.name : "Annonomous";
    if (currentUserName === "Annonomous") {
      res.redirect("/account");
    }
    const message = new Message({
      content: req.body.content,
      sender: req.user._id,
      receiver: req.body.receiver_id,
      creation_date: new Date()
    });

    message.save(function(err) {
      if (err) {
        console.log(err);
      } else {
        console.log("Saving Message");
      }
    });

    User.updateOne({
      "_id": req.user._id
    }, {
      $push: {
        "messages": message,
      }
    }, function(err) {
      if (err) {
        console.log(err);
      }
    });
  });

let receiver_id;
let mA;
let mB;

router.route('/chatHistory')
  .get(function(req, res) {
    async.parallel({
      messagesAFind: function(callback) {
        User.findOne({
          _id: req.user._id
        }).populate({
          path: 'messages',
          match: {
            'receiver': receiver_id
          }
        }).exec(function(err, userA) {
          if (err) return callback(err);
          mA = userA.messages;
          callback();
        });
      },
      messagesBFind: function(callback) {
        User.findOne({
          _id: receiver_id
        }).populate({
          path: 'messages',
          match: {
            'receiver': req.user._id
          }
        }).exec(function(err, userB) {
          if (err) return callback(err);
          mB = userB.messages;
          callback();
        });
      }
    }, function(err) {
        if (err) return next(err);
        console.log(mA);
        console.log(mB);
        var allMessages = [];
        allMessages.push(mA,mB);
        res.json(allMessages);
    });
  })
  .post(function(req, res) {
    if (req.body.str === "getChatHistory") {
      receiver_id = req.body.id;
    }
  });