最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

Mongoose findOneAndUpdate 没有更新数据库

网站源码admin36浏览0评论

Mongoose findOneAndUpdate 没有更新数据库

Mongoose findOneAndUpdate 没有更新数据库

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

{
  "_id": "64480569a2c60bc65d10b377",
  "username": "[email protected]",
  "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()})

我收到一条错误消息,说这不是一个函数。

回答如下:

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

{
    "_id": "64480569a2c60bc65d10b377",
    "username": "[email protected]",
    "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 } }
      );
发布评论

评论列表(0)

  1. 暂无评论