我正在使用Arango 3.3.10
我创建了一个用于用户登录和管理的狐狸服务 . 登录时我得到了用户名,然后我尝试使用几种方法检索文档 - .firstExample&._query
我成功获取了文档,但每次获取它都有一个不同的_key,_rev和_id .
如果我从ArangoDB Web界面中的“查询”工具运行查询,它就不会这样做 . 有任何想法吗?
EDIT: I solved the issue, but wanted to provide further details.
在我正在测试的集合中,只有一个文档 . 它有字段: username
, email
,以及密码的哈希/ salt .
当我检索文档时,我正在使用arangojs驱动程序的.firstExample函数 . 我削减了我的代码,以至于firstExample是唯一发生的数据库交互,之后它会立即将结果发送回客户端 . 代码成功检索文档,但每次文档都有不同的_key,_rev和_id .
如果我登录到数据库Web界面,我可以看到单独的文档,我可以看到_key,_rev和_id每次调用我的Foxx api时都会更改 . 据我所知,.firstExample函数永远不会产生这个结果 .
我发现它只在字段 username
设置为字符串'admin'时才执行此操作 . 如果我将 username
字段更改为其他任何内容,则此行为将停止,并按预期检索文档,并且_key,_rev和_id都保持不变 .
我相信这是一个错误,但我不知道它是DB中的错误还是arangojs驱动程序 . 我倾向于arangojs驱动程序,因为在使用ArangoDB Web界面中的查询工具运行查询时,此行为未显示 .
UPDATE: Further details emerge 因此,在进一步测试后,似乎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 回答
firstExample
将检索与指定模式匹配的文档 . 如果多个文档与模式匹配,则将返回其中一个文档 . 但它是不可预测的匹配文件 .因此,如果多个文件符合条件,
firstExample
可能会得到一个"random" . 用户名属性是否有唯一索引,因此确保每个用户名最多只有一个文档?如果是这样,请分享您使用检索文档的确切命令以及相关集合中的示例文档及其索引 .
如上所述,每次调用服务时都会运行'scripts / setup.js',而Foxx微服务则在“开发”模式下运行 . 如果在“ 生产环境 ”模式下运行,它只会在服务器启动时运行一次安装程序,然后保持代码的编译版本缓存 .
在您使用像WebStorm这样的IDE时,“开发”模式非常有用,它会自动将GIT目录中的代码部署到您的微服务的ArangoDB App目录中 . 它很有用,因为您编写的每个更改都会反映在微服务的下一个执行周期中 .
当性能出现问题时,或者在设置脚本中存在明显的逻辑时,不要在“开发”模式下运行Foxx微服务,因为它确实可以减慢它的速度 .
很高兴我们深究它,这是一个很好的教训 .
我解决了似乎必须保留用户名admin,因为只有在尝试获取具有该用户名的用户时才会出现此问题 . 其他用户退货很好 . 我将不得不更改我的设置脚本以创建具有不同名称的默认用户 .
更新另外,我不是从用户的系统集合中拉出来的,这是我自己的自定义集合 . 该文档有一个名为username的字段 . 如果此字段设置为“admin”,则会出现上述问题 . 似乎是一个非常奇怪的错误 .