我正在使用Arango 3.3.10
我创建了一个用于用户登录和管理的fox服务。登录时,我获得了用户名,然后尝试使用两种方法-.firstExample&._query
来检索文档。我成功获取了文档,但是每次获取时,它都有不同的_key,_rev和_id。
如果我从ArangoDB Web界面中的“查询”工具运行查询,则不会执行此操作。有什么想法吗?
编辑: 我解决了问题,但想提供更多详细信息。
在我要测试的集合中,只有1个文档。它具有以下字段:username
,email
和密码的哈希/盐。
检索文档时,我使用的是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时会触发设置脚本?
答案 0 :(得分:2)
firstExample
将检索与指定模式匹配的文档。如果多个文档匹配该模式,则将返回这些文档之一。但是,这将是哪个匹配文件是无法预测的。
因此,如果有多个文档符合条件,则使用firstExample
可能会得到一个“随机”文档。
用户名属性上是否有唯一索引,因此可以确保每个用户名最多有一个文档?
如果是,请分享您正在使用的确切命令,以获取文档以及相关集合中的示例文档及其索引。
答案 1 :(得分:1)
如上所述,当Foxx微服务以“开发”模式运行时,每次调用服务时似乎都在运行“ scripts / setup.js”。如果以“生产”模式运行,则它将仅在服务器启动时运行一次安装程序,然后保留已编译的代码版本。
“开发”模式在使用WebStorm这样的IDE时非常有用,它可以将代码从GIT目录自动部署到微服务的ArangoDB App目录中。这很有用,因为您编写的每项更改都会反映在微服务的下一个执行周期中。
重要的是,当性能成为问题时,或者在安装脚本中包含明显的逻辑时,不要在“开发”模式下运行Foxx微服务,因为这确实会降低速度。
很高兴我们能深入浅出,这是一个很好的经验教训。
答案 2 :(得分:0)
我解决了。似乎必须保留用户名admin,因为仅在尝试获取具有该用户名的用户时才会出现此问题。其他用户返回罚款。我将不得不更改安装脚本以使用其他名称创建默认用户。
更新 另外,我不是从用户的系统集合中提取资源,这是我自己的自定义集合。该文档有一个名为用户名的字段。如果此字段设置为“ admin”,则会出现上述问题。似乎是一个非常奇怪的错误。