私は現在、ユーザーがお友達としてお互いを追加できるユーザーシステムを持っています。これは私のルートです:MongoDB + NodeJS + Express - ユーザーは既に友達であるユーザーにフレンドリクエストを送ることができます
app.post("/addFriend", function(req, res) {
var conditions = {
$or: [
{$and: [
{username: req.body.globalUserName},
{$or: [
{'pendingFriends._id': {$ne: req.user._id}},
{'friends._id': {$ne: req.user._id}}
]}
]},
{$and: [
{username: req.user.username},
{$or: [
{'pendingFriends._id': {$ne: req.body.globalUserId}},
{'friends._id': {$ne: req.body.globalUserId}}
]}
]}
]
}
var update = {
$addToSet: {pendingFriends: { _id: req.user._id, username: req.user.username, language: req.user.language, profilePicture: req.user.profilePicture}}
}
User.findOneAndUpdate(conditions, update, function(error, doc) {
if(error) {
console.log(currentTime + " - FRIEND_REQUEST_SEND_ERROR: '" + req.user.username + "' TRIED TO SEND A FRIEND REQUEST TO '" + req.body.globalUserName + "'");
}
else {
console.log(currentTime + " - FRIEND_REQUEST_SENT: '" + req.user.username + "' SENT A FRIEND REQUEST TO '" + req.body.globalUserName + "'");
}
res.redirect("/talk");
});
});
これはどのように動作するのですか。
U1はU2にフレンドリクエストを送信します。
U2の保留中の友人にU1が追加されます。
U2が受け入れると、U1はU2の友人に行き、U2はU1の友達に行きます。
しかし、今私は知っている2つのバグがあります。
U1がU2の友人要求を送信し、U1がU2の保留中の友人にいる場合、U2は友人要求をU1に送信できます。
また、U1がU2にフレンドリクエストを送信した場合、U2が受け入れた後、U1とU2の両方がお互いにフレンドリクエストを送信できます。
これを修正するにはどうすればよいですか?ちなみに、req.userはアクションを実行しているユーザー(フォームの送信など)です。 req.body.globalUserIdは、アクションを実行しているユーザーが追加しようとしているユーザーのIDです。
EDIT(ユーザーの要求によってユーザー・スキーマ):
UserSchema = new mongoose.Schema({
username: String,
email: String,
password: String,
language: { type: String, default: "English" },
profilePicture: { type: String, default: "/images/talk/blank-profile-picture.png" },
status: String,
pendingFriends: [this],
friends: [this]
})
私はそれが操作のためだと思います。 – Remario