在没有try / catch的情况下检查CosmosDB项目是否存在

时间:2018-12-03 14:34:15

标签: javascript node.js azure-cosmosdb

我正在使用Node.js CosmosDB library,并且要检查是否存在某项。

我看过一些推荐以下内容的例子:

const i = container.item(id);

try {
    const { item } = await i.read();
    // item exists
} catch(e) {
    // item does not exist
}

但是我不想使用异常进行流控制。我也想避免使用container.items.query-如果可能,我想使用container.item

我可以这样做吗?


我想知道如何执行此操作的原因是,我需要致电Item.replace来更新商品,所以我想这样做:

const i = container.item(id);

if (i.exists() === false) {
    return;
}

i.replace(replacement);

但是,如果我必须使用container.items.query,则必须这样做:

const result = container.items.query(myQuery);

if (result.current() === undefined) {
    return;
}

container.item(id).replace(replacement);

1 个答案:

答案 0 :(得分:1)

现在,404表示我们抛出。

我们正在考虑不扔东西。我刚刚在GitHub上创建了一个项目来进行跟踪。 https://github.com/Azure/azure-cosmos-js/issues/203

根据文档的大小,查询实际上可能更便宜,因为您可以查询的只是id或_etag而不是整个文档。对于小文档,阅读会便宜一些。

作为一种解决方法,增补对您有用吗?

-编辑1-

另一种错误的选择是自己处理错误,因为这是所有承诺。

const handle404 = (err) => {
    if(err.code && err.code === 404) {
        return { body: undefined, headers: err.headers };
    } else {
        throw err;
    }
} 

const { body: item } = await container.item(id).read().catch(handle404);