mongodb Mongoose findOneAndUpdate未更新数据库

qoefvg9y  于 2023-04-29  发布在  Go
关注(0)|答案(2)|浏览(172)

我有一个数据库,它有一个结构。我已经清楚地更新了值,但想法仍然存在。我试图从本质上找到刷新令牌并使用新令牌更新它。下面是数据库结构示例

{
  "_id": "64480569a2c60bc65d10b377",
  "username": "markapiland@yahoo.com",
  "refreshTokens": [
    {
      "refreshToken": "token_example_1",
      "_id": "64480569a2c60bc65d10b37a"
    }
  ],
  "salt": "salted_stuff",
  "hash": "hashed_stuff",
  "__v": 1
}

下面是我的模式结构

const session = new Schema({
  refreshToken: {
    type: String,
    default: '',
  },
});

const userSchema = new Schema({
  password: String,
  refreshTokens: [session],
});

userSchema.set('toJSON', {
  transform: function (doc, ret, options) {
    delete ret.refreshToken;
    return ret;
  },
});

现在,我想做的是更新它

User.findOneAndUpdate(
        { _id: userId, refreshTokens: { $elemMatch: { refreshToken: refreshToken } } },
        { $set: { 'refreshTokens.$.refreshToken': newRefreshToken } }
      );

newRefreshToken是从另一个函数构建的,userId是基于另一个内部检索函数的变量。这两个都是工作的,我已经安慰记录他们,可以看到他们是正确的。
当我检查数据库时,refreshToken在运行查询后没有改变。
我做错什么了吗?原始用户创建和一切工作正常,所以我知道连接在那里,它没有返回任何错误。即使这个更新也没有返回错误。只是没有更新数据。
我已经搜索了许多其他问题和论坛。我尝试了mongoplayground,它似乎工作,所以不知道为什么它实际上不工作。
我也试过

User.updateOne(
        { _id: userId, refreshTokens: { $elemMatch: { refreshToken: refreshToken } } },
        { $set: { 'refreshTokens.$.refreshToken': newRefreshToken } }
      );

User.findOneAndUpdate(
        { _id: userId, 'refreshTokens.refreshToken': refreshToken } } },
        { $set: { 'refreshTokens.$.refreshToken': newRefreshToken } }
      );

到目前为止还没有成功。如果我试着

.then((user) => {user.save()})

我得到一个错误,说这不是一个函数。

vh0rcniy

vh0rcniy1#

我注意到你的原始代码中有两个额外的括号。修复如下:

{
    "_id": "64480569a2c60bc65d10b377",
    "username": "markapiland@yahoo.com",
    "refreshTokens": [
      {
        "refreshToken": "token_example_1",
        "_id": "64480569a2c60bc65d10b37a"
        }
    ],
    "salt": "salted_stuff",
    "hash": "hashed_stuff",
    "__v": 1
  }

也许代替

User.findOneAndUpdate(
        { _id: userId, refreshTokens: { $elemMatch: { refreshToken: refreshToken } } },
        { $set: { 'refreshTokens.$.refreshToken': newRefreshToken } }
      );

您可以尝试:

User.findOneAndUpdate(
        { _id: userId, "refreshTokens.refreshToken": refreshToken  },
        { $set: { 'refreshTokens.$.refreshToken': newRefreshToken } }
      );
dbf7pr2w

dbf7pr2w2#

对于任何遇到同样问题的人来说。..
最后我不得不设置。post为asyn函数,然后使用。等待加。exec()用于findOneAndUpdate函数,如下所示

router.post('/refreshToken', async (req, res, next) => {
...
        await User.findOneAndUpdate(
          {
            _id: userId,
            refreshTokens: {
              $elemMatch: { refreshToken: refreshToken },
            },
          },
          {
            $set: { 'refreshTokens.$.refreshToken': newRefreshToken },
          }
        )
          .exec()
...
}

这迫使数据库在创建新cookie和存储新令牌之前进行更新。

相关问题