检索文档时,ArangoDB _key发生了变化

时间:2018-06-23 00:02:31

标签: key document arangodb

我正在使用Arango 3.3.10

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

来检索文档。

我成功获取了文档,但是每次获取时,它都有不同的_key,_rev和_id。

如果我从ArangoDB Web界面中的“查询”工具运行查询,则不会执行此操作。有什么想法吗?

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

在我要测试的集合中,只有1个文档。它具有以下字段:usernameemail和密码的哈希/盐。

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

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

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

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

更新:出现更多详细信息 因此,在进一步测试之后,似乎某种程度上触发了Foxx服务的安装脚本。安装脚本将创建一个默认用户“ admin”。因此似乎正在发生的事情是,当API被命中时,安装脚本会以某种方式运行,它每次都会重新创建用户并分配新的_key,_rev和_id,然后将其发送回给我。因此,结果是每次删除并重新创建管理员用户。

我已经将代码缩小为绝对必要的内容,并且仍会触发设置脚本:

index.js

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

user-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时会触发设置脚本?

3 个答案:

答案 0 :(得分:2)

firstExample将检索与指定模式匹配的文档。如果多个文档匹配该模式,则将返回这些文档之一。但是,这将是哪个匹配文件是无法预测的。

因此,如果有多个文档符合条件,则使用firstExample可能会得到一个“随机”文档。 用户名属性上是否有唯一索引,因此可以确保每个用户名最多有一个文档?

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

答案 1 :(得分:1)

如上所述,当Foxx微服务以“开发”模式运行时,每次调用服务时似乎都在运行“ scripts / setup.js”。如果以“生产”模式运行,则它将仅在服务器启动时运行一次安装程序,然后保留已编译的代码版本。

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

重要的是,当性能成为问题时,或者在安装脚本中包含明显的逻辑时,不要在“开发”模式下运行Foxx微服务,因为这确实会降低速度。

很高兴我们能深入浅出,这是一个很好的经验教训。

答案 2 :(得分:0)

我解决了。似乎必须保留用户名admin,因为仅在尝试获取具有该用户名的用户时才会出现此问题。其他用户返回罚款。我将不得不更改安装脚本以使用其他名称创建默认用户。

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