查询两个猫鼬用户之间的消息历史记录的建议

问题描述

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

我目前正在尝试从用户数据库获取消息。 对于_id,我尝试使用ajax get请求并将id传递为req主体的数据。通过一些研究,我发现将数据传递给get请求是一个坏主意。 为什么?如果HTTP方法是不能具有实体主体(例如GET)的方法,则数据将附加到URL(“我试图在Yikes之后从URL中获取ID”)。 URL中包含用户数据可能会产生各种各样的后果。 https://security.stackexchange.com/questions/29598/should-sensitive-data-ever-be-passed-in-the-query-string

模式:

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,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
        });
      });

此刻,仅尝试获取当前用户发送给1个人的消息

路由:

router.route('/chatHistory')
  .get(function(req,res) {
    User.findOne({
      _id: req.user._id
    }).populate({
      path: 'messages',match: { 'receiver': receiver_id },}).exec(function(err,user) {
      if (!err) {
        res.json(user.messages);
      } else {
        console.log(err);
      }
    });
  });

通过发布请求,我能够将ID成功存储到我的route.js文件中的变量中。现在,我正在处理查询参数,以仅显示我在get请求中发送给特定用户的消息。

工作代码

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',}).then(function(data) {
  if (data.length <= 0) {
    console.log("no data");
  } else {
    data = data.reverse();
    data.forEach(function(element) {
      console.log(element);
    });
  }
});

我的messageSchema中有错字。在我的数据库中,接收者被拼成接收者。 FeelsBadMan。

工作代码

查询消息和&查询用户

路由

var receiver_id;

//Query On Messages
router.route('/chatHistory')
  .get(function(req,res) {
    var id = mongoose.Types.ObjectId(receiver_id);
    console.log(id);
    Message.find({
      receiver: { $eq: id}
    }).exec(function(err,messages) {
      if (!err) {
        console.log(messages);
        res.json(messages);
      } else {
        console.log(err);
      }
    });
  })
  .post(function(req,res) {
    if (req.body.str === "getChatHistory") {
      receiver_id = req.body.id;
    }
  });

//Query on users
router.route('/chatHistory')
  .get(function(req,user) {
      if (!err) {
        res.json(user.messages);
      } else {
        console.log(err);
      }
    });
  })
  .post(function(req,res) {
    if (req.body.str === "getChatHistory") {
      receiver_id = req.body.id;
    }
  });

主要问题是我如何创建消息。除了接收方的ID,我还存储了另一个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);
      }
    });
  });

上面的代码为接收者存储了错误用户ID。

以下代码解决了该问题

工作代码

router.route('/messages')
  .get(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,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
    },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;
    }
  });

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)