首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用arangojs将参数传递给db.query

用arangojs将参数传递给db.query
EN

Stack Overflow用户
提问于 2016-01-07 08:45:56
回答 1查看 1.3K关注 0票数 7

我在用ArangoJS库发送参数时遇到了问题,我想知道是否有人能帮上忙。

使用下面的示例,如果查询中有参数值,则可以执行db.query,但一旦尝试使用bindVars,就会得到无声的错误,无法提取任何错误细节。

代码语言:javascript
复制
var db = require('arangojs')("http://127.0.0.1:8529");

/*
The '_system' database contains a collection called 'test' that contains one document:
 {
   "a": 1,
   "b": 2
 }
 */

// This works
db.query('FOR t IN test FILTER t.a == 1 RETURN t')
  .then((cursor) => {
    cursor.all()
      .then(vals => {
        console.log("\nNo bindVars");
        console.log(vals);
      });
  });

// This does not work
db.query("FOR t IN @first FILTER t.a == @second RETURN t", { first: "test", second: 1 })
  .then((cursor) => {
    cursor.all()
      .then(vals => {
        console.log("\nUsing bindVars");
        console.log(vals);
      });
  });

我是Node.js和ArangoDB的新手,我希望能够正确地使用参数化查询。

我还假设这种参数的使用可以保护您免受SQL注入样式的攻击吗?

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-07 10:14:06

问题不在于JavaScript驱动程序或节点,问题在于查询本身:

代码语言:javascript
复制
FOR t IN @first FILTER t.a == @second RETURN t

在AQL集合中,不能用普通的绑定参数注入名称。这是因为您实际上并不试图将参数用作字符串值,而是引用具有该名称的集合。引用AQL文件

存在用于注入集合名称的特殊类型的bind参数。这种类型的bind参数有一个以附加@符号作为前缀的名称(因此,在查询中使用bind参数时,必须使用两个@符号)。

换句话说,在AQL中,它必须被称为@@first (而不是@first),在db.query的绑定参数参数中,它必须被称为@first (而不仅仅是first)。

当使用arangojs时,实际上可以通过使用模板处理程序来完全避免这种情况。

代码语言:javascript
复制
var aqlQuery = require('arangojs').aqlQuery;
var first = db.collection('test');
var second = 1;

db.query(aqlQuery`
  FOR t IN ${first}
  FILTER t.a == ${second}
  RETURN t
`).then(
  cursor => cursor.all()
).then(vals => {
  console.log('Using aqlQuery');
  console.log(vals);
});

这样,您就不必在编写查询时考虑绑定参数语法,并且可以编写更复杂的查询,而不必处理非常长的字符串。注意,它将识别arangojs集合实例并相应地处理它们。使用字符串而不是集合实例将导致与示例中相同的问题。

另外,请注意,模板处理程序也存在于arangosh和ArangoDB本身中(例如,在使用Foxx时)。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34650706

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档