【问题标题】:How to correctly make a datastore query in Node.js?如何在 Node.js 中正确进行数据存储查询?
【发布时间】:2021-03-05 21:29:22
【问题描述】:

试图从我的谷歌云数据存储中获取实体,按键名过滤。不确定我在代码中做错了什么。

我创建我的数据存储区

const ds = new Datastore({
  projectId: "my-project",
  keyFilename: "./servicekey.json",
  namespace: "client-dummy",
});

然后创建一个key进行过滤

  const _key = ds.key({
    namespace: "client-dummy",
    path: ["transactions", data.id],
  });

通过提供命名空间、种类和基于键的过滤器来创建我的查询。

const query = ds
    .createQuery("client-dummy", "transactions")
    .filter("__key__", _key);

最后运行查询

const result = await ds.runQuery(query);

但结果总是空的

[ [], { moreResults: 'NO_MORE_RESULTS', endCursor: 'CgA=' } ]

我尝试在 UI 上运行相同的查询并获得结果。我不知道代码有什么问题。有人可以帮忙吗?

【问题讨论】:

  • 你确定这样的对象存在吗? data.id 是什么?
  • 是的,我确定。因为我在数据存储 UI 上进行了相同的查询并获得了预期的结果。 data.id 是正确的。我把它打印在控制台日志上。

标签: javascript node.js google-cloud-platform google-cloud-datastore


【解决方案1】:

我在我这边复制了相同的代码,并且遇到了同样的问题。为了能够复制,我将data.id 模拟为const data = {id: 1},然后创建了一个实体来匹配用例并且确实具有相同的行为。

玩了一会儿之后,我注意到在 UI(GCP 中的数据存储)的“编辑实体”中,Key literalKey(transactions, '1'),这意味着这个 '1' 是一个字符串。

只需添加 toString() 方法即可。所以密钥创建看起来像这样:

const _key = ds.key({
    namespace: "client-dummy",
    path: ["transactions", data.id.toString()]
  });

【讨论】:

    猜你喜欢
    • 2021-11-06
    • 1970-01-01
    • 2017-06-23
    • 1970-01-01
    • 1970-01-01
    • 2015-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多