ArangoDB _key 在检索文档时发生变化

ArangoDB _key is changing when retrieving document

我正在使用 Arango 3.3.10

我创建了一个用于用户登录和管理的fox 服务。登录时我得到了用户名,然后我尝试使用几种方法检索文档 - .firstExample & ._query

我成功获取了文档,但是每次获取文档的_key、_rev、_id都不一样

如果我 运行 来自 ArangoDB 网络界面中的 "Queries" 工具的查询,它不会这样做。有什么想法吗?

编辑: 我解决了问题,但想提供更多详细信息。

在我测试的集合中,只有 1 个文档。它有字段:usernameemail 和一个 hash/salt 密码。

当我检索文档时,我正在使用 arangojs 驱动程序的 .firstExample 函数。我精简了我的代码,以至于 firstExample 是唯一发生的数据库交互,然后它会立即将结果发送回客户端。代码成功检索了文档,但每次文档都有不同的 _key、_rev 和 _id。

如果我登录到数据库Web 界面,我可以看到单独的文档,而且我可以看到每次调用我的Foxx 时_key、_rev 和_id 都会改变api。据我所知,.firstExample 函数永远不会产生这个结果。

我发现它仅在字段 username 设置为字符串 'admin' 时执行此操作。如果我将 username 字段更改为其他任何内容,此行为将停止并且文档将按预期检索并且 _key、_rev 和 _id 都保持不变。

我认为这是一个错误,但我不知道它是数据库中的错误还是与 arangojs 驱动程序有关。我倾向于使用 arangojs 驱动程序,因为当 运行 使用 ArangoDB 网络界面中的查询工具进行查询时,这种行为没有表现出来。

更新:出现更多细节 因此,在进一步测试之后,Foxx 服务的安装脚本似乎以某种方式被触发了。安装脚本创建一个名为 'admin' 的默认用户。所以似乎正在发生的事情是设置脚本 运行s 当 API 被点击时,它每次都会重新创建用户并分配一个新的 _key、_rev 和 _id,然后它被发送回我。所以结果是管理员用户每次都被删除并重新创建。

我已将代码缩小到绝对必要的范围,但设置脚本仍然被触发:

index.js

'use strict'
const userRoutes = require('./user-routes')
module.context.use(userRoutes)

用户-routes.js

'use strict'
const joi = require('joi'
const createRouter = require('@arangodb/foxx/router')
const usersColl = module.context.collection('users')
const router = createRouter()
router
  .post('/test', function (req, res) {
    const username = req.body.username

    try {
      const user = usersColl.firstExample('username', username)
      res.send(user)
    } catch (e) {
      res.throw(404, e)
    }
  })
  .body(
    joi
      .object({
        username: joi.string().required()
      })
      .required(),
    'Username'
  )
  .summary('Username test')
  .description('Username test')

manifest.json

{
  "engines": {
    "arangodb": "^3.0.0"
  },
  "main": "index.js",
  "scripts": {
    "setup": "scripts/setup.js"
  },
  "provides": {
    "@pulse/user-mgmt": "1.0.0"
  }
}

为什么这会在调用 API 时触发安装脚本?

firstExample 将检索与指定模式匹配的文档。如果多个文档与模式匹配,则将返回其中一个文档。但是它会是哪个匹配文档是不可预测的。

因此,如果有多个文件符合条件,firstExample 您可能会得到一个 "random"。 用户名属性是否有唯一索引,因此确保每个用户名最多有一个文档?

如果是这样,请分享您正在使用的确切命令来检索文档以及相关集合中的示例文档及其索引。

我解决了。似乎必须保留用户名 admin,因为只有在尝试使用该用户名获取用户时才会出现问题。其他用户 return 没问题。我将不得不更改我的设置脚本以创建具有不同名称的默认用户。

更新 另外,我不是从用户的系统集合中提取的,这是我自己的自定义集合。该文档有一个名为用户名的字段。如果此字段设置为 'admin',则会出现上述问题。似乎是一个非常奇怪的错误。

如上所述,看起来 'scripts/setup.js' 每次调用服务时都是 运行ning,而 Foxx 微服务在 'Development' 模式下是 运行ning。如果运行在'Production'模式下,它只会在服务器启动时运行设置一次,然后缓存代码的编译版本。

'Development' 模式在您使用像 WebStorm 这样的 IDE 时非常有用,它会自动将代码从您的 GIT 目录部署到您的微服务的 ArangoDB App 目录中。这很有用,因为您编写的每项更改都会反映在微服务的下一个执行周期中。

重要的是,当性能有问题,或者设置脚本中有明显的逻辑时,运行 Foxx 微服务不要处于 'Development' 模式,因为它确实会减慢速度。

很高兴我们追根究底,这是一个很好的教训。