You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

BigchainDB JavaScript ORM问题:资产批量查询与追加更新异常

问题1:查询模型下所有资产

首先得理清bigchaindb-orm模型的工作逻辑:当你通过ORM创建模型(比如myModel)并生成资产时,ORM会自动把模型名写入资产的metadata字段中的_model属性。调用myModel.retrieve()不带参数时,ORM会向BigchainDB节点发起查询,过滤出所有metadata._model匹配你模型名的资产。

你用的是公共测试节点https://test.bigchaindb.com,这个节点是所有开发者共享的——如果模型名太通用(比如myModel),必然会查到其他用户用同名模型创建的资产,数据量过大就触发了节点的请求速率限制(也就是你遇到的429错误)。改成testung这种独特名字后,因为很少有其他用户使用,所以只会返回你自己创建的资产。

结论:模型名在你使用的BigchainDB网络(尤其是公共测试网)上需要全局唯一,建议给模型名加上项目专属前缀(比如myCityTracker_AssetModel),既避免和其他用户的模型冲突,也能减少查询返回的数据量,规避429限流问题。


问题2:追加更新已创建资产

首先要纠正一个BigchainDB的概念误解:BigchainDB里的核心资产原始数据是不可变的——CREATE交易创建的资产数据永远不能修改。append方法的本质是创建一笔TRANSFER交易,将资产控制权转移(哪怕是转移给自己),同时在TRANSFER交易的metadata中附加新信息,以此实现“更新”的效果(本质是新增一条带更新内容的交易记录)。

你的代码不生效的核心问题是:myModel.retrieve(req.params.assetId)返回的是资产数组(哪怕只匹配到一个资产),你直接调用asset.append()是在数组上调用方法,这显然不对。需要先取出数组中的第一个资产对象再调用append,修正后的代码如下:

exports.update_an_entry = function(req, res) {
    bdbOrm.models.myModel
        .retrieve(req.params.assetId)
        .then(assets => {
            // 取出查询到的单个资产对象
            return assets[0].append({
                toPublicKey: aliceKeypair.publicKey,
                keypair: aliceKeypair,
                data: {
                    price: req.params.price,
                }
            })
        })
        .then(updatedAsset => {
            res.json(updatedAsset)
        })
        .catch(err => {
            // 建议添加错误捕获,方便排查问题
            res.status(500).json({error: err.message})
        })
}

另外,CRAB教程返回400错误,大概率是因为教程版本和你使用的bigchaindb-orm v2.0.0不兼容——ORM的API在不同版本间可能有参数格式、方法名的变化,建议你对照bigchaindb-orm v2.0.0的官方文档调整教程代码,检查请求参数、交易结构是否符合当前版本要求。

内容的提问来源于stack exchange,提问作者becede

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:10:02