node.js - Bigtable 尝试确定行是否存在,模拟器因行不存在而挂起(在 row.exists() 上)

标签 node.js google-cloud-platform google-cloud-bigtable bigtable

从 node.js 连接到本地运行的 bigtable 模拟器,我需要能够确定特定行是否存在。虽然这对于确实存在的行按预期工作,但对于表中未包含的键,似乎 row.exits() 无限期挂起。

这是一个最小示例:

const { Bigtable } = require('@google-cloud/bigtable');
const btInstance = Bigtable().instance('test');
const table = btInstance.table('testTable');
const [tableExists] = await table.exists();
if (!exists) {
  await table.create();
  await table.createFamily('testFamily');
}
const row = await table.row('testkey');

console.log('Table existence ensured. Checking if row exists...');

// fine till here...
const [rowExists] = await row.exists();
// may never get here, if connected to the emulator and row *doesn't* exist

if (!rowExists) {
  console.log('Row doesn\'t exist!');
} else {
  console.log('Row already exists.');
}

当连接到 Bigtable 的实时 Google Cloud 实例时,代码运行良好:报告不存在的行。但是,当连接到模拟器时,如果行不存在,则代码永远不会经过 row.exists() 调用;也没有抛出任何错误。

我想要做的事情有什么问题吗,或者是否可以采取某种解决方法(可能是检查给定键是否存在行的不同方法)?

最佳答案

tableExists 变量似乎有拼写错误。使用以下示例,我能够重现该问题。请关注此处的更新: https://github.com/googleapis/nodejs-bigtable/issues/555

mkdir cbt-hang
cd cbt-hang
npm init --yes
npm install @google-cloud/bigtable

cat <<- EOF > index.js
const Bigtable = require('@google-cloud/bigtable');

async function main() {
    console.log("getting instance" )
    const btInstance = Bigtable().instance('test');

    console.log("getting table" )
    const table = btInstance.table('testTable');

    console.log("checking table existence" )
    const [tableExists] = await table.exists();
    if (!tableExists) {
        console.log("creating table" )
        await table.create();
        console.log("creating family" )
        await table.createFamily('testFamily');
    }

    console.log("getting row" )
    const row = await table.row('testkey');

    console.log("checking row exists")
    const [rowExists] = await row.exists();

    if (!rowExists) {
      console.log('Row doesn\'t exist!');
    } else {
      console.log('Row already exists.');
    }
}
main().catch(e => console.log(e));
EOF

gcloud beta emulators bigtable start --host-port=localhost:8086 &
BIGTABLE_EMULATOR_HOST=localhost:8086 node index.js

kill %1

关于node.js - Bigtable 尝试确定行是否存在,模拟器因行不存在而挂起(在 row.exists() 上),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57205288/

相关文章:

javascript - 在Javascript中获取分配给扩展函数原型(prototype)的数组长度

python - 如何使用 python 从 gs 存储桶中获取文件数

python - 导入和初始化 GCP googleapis/google-cloud-python 客户端

google-cloud-bigtable - 使用 Google Cloud BigTable 时出现编译错误

bigtable - 如何在谷歌云平台之外连接谷歌bigtable

java - 标准(非灵活)Google App Engine 是否支持 Google Cloud Bigtable?

javascript - 设置状态后无法发送响应

javascript - Sails.js:在我想发送实际响应之前发送了 200 响应

javascript - 当流管道用于缓冲时, Node 回显服务器性能下降 10 倍

node.js - Google Cloud Vision API - 将输出作为 JSON 对象而不是 GCS 文件返回