数据存储查询过滤器在后续调用中累积

时间:2018-07-18 21:37:31

标签: node.js express google-app-engine google-cloud-datastore

我正在制作RESTFul API。我有以下端点

/users/getByState/stateId

我在数据库中有几个用户。 3位用户来自德克萨斯州,一位来自纽约。

当我第一次呼叫端点时,可以通过

/user/getByState/tx

或通过

/user/getByState/ny

我得到一个结果,但是立即使用另一个状态ID调用端点,返回一个空数组和消息{“ moreResults”:“ NO_MORE_RESULTS”}

将查询发送到控制台日志表明,第一次查询仅具有一个过滤器..可以说

FILTER:{stateID:'tx'}

但是第二次,不是将filter选项更改为“ ny”,而是添加了另一个过滤器,因此现在在控制台日志中我看到了

FILTER:{stateId:'tx'}
FILTER:{stateId:'ny'}

显然它将始终返回一个空数组,因为它将永远找不到stateId ='tx'和stateId ='ny'

我不明白为什么云数据存储客户端向CONST添加过滤器!

如果我呼叫端点7次,则会看到7个过滤器。只有在重新部署过滤器后,“清除”

如何在再次运行查询之前清除过滤器?在云端数据存储区文档中对此进行了搜索,但是没有有关每次调用后串联过滤器的信息

我想念什么吗?这是我的代码:

const Datastore = require('@google-cloud/datastore');
const datastore=Datastore();
const query=datastore.createQuery("user");

exports.get_user_by_state =(req,res,next) => {
   const pageCursor = req.query.cursor;
   const userState=req.params.stateId;

   const selectQuery = query
    .filter('stateId',userState)

   console.log(selectQuery);

   selectQuery.run({cache:false})
    .then((results) => {
      res.json(results);
      })
    .catch(err => res.status(500).json(err));
   }

1 个答案:

答案 0 :(得分:1)

  

每个查询都需要一个新的查询对象。因此,应在块内部创建查询对象。

const Datastore = require('@google-cloud/datastore');
const datastore = Datastore();

exports.get_user_by_state =(req,res,next) => {
   const pageCursor = req.query.cursor;
   const query      = datastore.createQuery("user");
   const userState  = req.params.stateId;

   const selectQuery = query
    .filter('stateId',userState)

   console.log(selectQuery);

   selectQuery.run({cache:false})
    .then((results) => {
      res.json(results);
    })
    .catch(err => res.status(500).json(err));
   }