我有一个数据库,它有一个这样的 struct .我已经清楚地更新了值,但 idea 仍然存在.实际上,我正在try 找到刷新令牌并使用新令牌更新它.以下是数据库 struct 示例

{
  "_id": "xxxxxxxxxxxxxxxxx",
  "username": "abcd@yahoo.com",
  "refreshTokens": [
    {
      "refreshToken": "token_example_1",
      "_id": "xxxxxxxxxxxxxxxxx"
    }
  ],
  "salt": "salted_stuff",
  "hash": "hashed_stuff",
  "__v": 1
}

以下是我的架构 struct

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

新的刷新令牌是从另一个函数构建的,而userid是一个基于另一个内部检索函数的变量.正如我所安慰的那样,这两个都在工作,我已经记录了它们,并且可以看到它们是正确的.

当我判断数据库时,在运行查询之后,renhToken没有改变.

我是不是做错了什么?最初的用户创建和一切都运行得很好,所以我知道连接在那里,它不会返回任何错误.即使是这次更新也没有返回错误.它只是没有更新数据.

我已经搜索了多个其他问题和论坛.我试过了,它似乎起作用了,所以我不确定为什么它实际上不起作用.

我也试过了

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()})

我收到一个错误,说这不是一个函数.

推荐答案

对于其他遇到同样问题的人来说...

最后,我不得不将.post设置为ASYN函数,然后使用.aWait加.exec()作为findOneAndUpdate函数,如下所示

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

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

Node.js相关问答推荐

即使DDB键不存在, node Lambda也不会失败,并返回NULL作为结果

正在try 使用Azure Function App上载文件时未上载文件(&Q;)

findoneandupdate()方法更新数据库,但其响应在请求中返回为null

对于具有重叠列的组合键,在冲突&q;上没有唯一或排除约束匹配错误

未显示NPM版本

向url传递多个参数

一个大型的单个 Redis 实例可以处理所有事情,还是多个 Redis 实例?

遇到 - TypeError:try 使用 Express(Node.js) 从 JSON 文件访问数据时无法读取未定义的属性(读取帖子)

运行 cypress 测试时如何指定 .env 文件用于我的开发服务器?

Nodejs 从链接数组中获取数据并保存到 mongodb

从 Response.json() 返回的 JSON 似乎无效?

Google Calendar API FreeBusy 外部用户

将已保存的卡片从条带显示到前端

如何在 mongoDB 中进行全动态搜索?

如何在 node.js 环境中从 WebAssembly (Rust) 调用异步 JavaScript 导入函数?

使用 Node.js 在内存中缓冲整个文件

eslint - vscode 的可选链接错误

Sequelize 基于关联的查找

使用 MongoDB 更新嵌套数组

promise 回调返回promise