首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何解决#hyperledger-Composer V0.14解组错误

如何解决#hyperledger-Composer V0.14解组错误
EN

Stack Overflow用户
提问于 2017-11-11 00:30:43
回答 1查看 225关注 0票数 0

我刚刚从V0.13.2迁移到V0.14.2,现在在事件处理中遇到以下错误。错误似乎出现在composer-client代码中,而不是我的。有什么解决的办法吗?我的应用程序仍然在发布和处理事件,所以我的代码看起来仍然可以工作,但这些错误消息的存在令人担忧,它们的数量超出了我的控制台窗口。

代码语言:javascript
复制
error: [EventHub.js]: on.data - Error unmarshalling transaction= TypeError: Cannot read property 'getSerializer' of null
    at events.forEach (<path>Z2B_Master/Chapter12/node_modules/composer-client/lib/businessnetworkconnection.js:483:73)
    at Array.forEach (native)
    at HLFConnection.connection.on (<path>Z2B_Master/Chapter12/node_modules/composer-client/lib/businessnetworkconnection.js:482:29)
    at emitOne (events.js:96:13)
    at HLFConnection.emit (events.js:188:7)
    at ChainCodeCBE.ccEvent.eventHubs.(anonymous function).registerChaincodeEvent [as onEvent] (<path>Z2B_Master/Chapter12/node_modules/composer-connector-hlfv1/lib/hlfconnection.js:231:22)
    at <path>Z2B_Master/Chapter12/node_modules/fabric-client/lib/EventHub.js:810:12
    at Set.forEach (native)
    at EventHub._processChainCodeOnEvents (<path>Z2B_Master/Chapter12/node_modules/fabric-client/lib/EventHub.js:808:14)
    at ClientDuplexStream.<anonymous> (<path>Z2B_Master/Chapter12/node_modules/fabric-client/lib/EventHub.js:311:10)

在V0.13中使用相同的代码时不会出现此错误。

所有事件都是通过sample.js文件中的单个函数发出的。事务调用该函数,如下例所示:

代码语言:javascript
复制
/**
 * create an order to purchase
 * @param {org.acme.Z2BTestNetwork.CreateOrder} purchase - the order to be processed
 * @transaction
 */
function CreateOrder(purchase) {
    purchase.order.buyer = purchase.buyer;
    purchase.order.amount = purchase.amount;
    purchase.order.financeCo = purchase.financeCo;
    purchase.order.created = new Date().toISOString();
    purchase.order.status = JSON.stringify(orderStatus.Created);
    return getAssetRegistry('org.acme.Z2BTestNetwork.Order')
        .then(function (assetRegistry) {
            return assetRegistry.update(purchase.order)
            .then (function (_res) 
            {
                z2bEmit('Created', purchase.order);
                return (_res);
            }).catch(function(error){return(error);});
        });
}

每个事务使用唯一的_event字符串调用z2bEmit函数。

代码语言:javascript
复制
function z2bEmit(_event, _order)
{
    var method = 'z2bEmit';
    var factory = getFactory();
    var z2bEvent = factory.newEvent(ns, _event);
    z2bEvent.orderID = _order.$identifier;
    z2bEvent.buyerID = _order.buyer.$identifier;
    emit(z2bEvent);
    return
}

_order是cto文件中定义的资产,_event是cto文件中定义的事件。

客户端代码有一个单独的例程,只执行一次,用来设置监视:

代码语言:javascript
复制
/**
 * Register for all of the available Z2BEvents
 * @param {express.req} req - the inbound request object from the client
 * @param {express.res} res - the outbound response object for communicating back to client
 * @param {express.next} next - an express service to enable post processing prior to responding to the client
*/
exports.init_z2bEvents = function (req, res, next)
{
    var method = 'init_z2bEvents';
    if (bRegistered) {res.send('Already Registered');}
    else{
        bRegistered = true;
        let _conn = svc.createAlertSocket();
        let businessNetworkConnection;
        businessNetworkConnection = new BusinessNetworkConnection();
        // following line added to deal with eventListener error message that more eventListeners needed to be added
        businessNetworkConnection.setMaxListeners(50);
        return businessNetworkConnection.connect(config.composer.connectionProfile, config.composer.network, config.composer.adminID, config.composer.adminPW)
        .then(() => {
            businessNetworkConnection.on('event', (event) => {_monitor(svc.al_connection, svc.f_connection, event); });
            res.send('event registration complete');
        }).catch((error) => {
            console.log(method+' business network connection failed'+error.message); 
            res.send(method+' business network connection failed'+error.message);
        });
    }
}

connectionProfile为'hlfv1‘

还有一个单独的监控程序,它会找出发布了什么类型的事件,然后使用web套接字将该信息发送到浏览器,以便可以发布或更新警报图标。下面是该函数的简短版本。_conn _f_conn继续正常工作。_event信息正在被传入,并继续被正确解析。无论程序运行多长时间,eventhub.js消息都会出现在每个警报上。

代码语言:javascript
复制
/**
 * _monitor
 * @param {web.socket} _conn - web socket connection for general alerts
 * @param {web.socket} _f_conn - web socket for finance alerts
 * @param {org.acme.z2bNetwork.Event} _event - the event just emitted
 * 
 */
function _monitor(_conn, _f_conn, _event)
{
    var method = '_monitor';
    console.log(method+ ' _event received: '+_event.$type+' for Order: '+_event.orderID);
    var event = {};
    event.type = _event.$type;
    event.orderID = _event.orderID;
    event.ID = _event.buyerID;
    _conn.sendUTF(JSON.stringify(event));

    switch (_event.$type)
    {
        case 'Created':
        break;
        case 'Bought':
        case 'PaymentRequested':
            event.ID = _event.sellerID;
            _conn.sendUTF(JSON.stringify(event));
            event.ID = _event.financeCoID;
            _f_conn.sendUTF(JSON.stringify(event));
        break;
        case 'Ordered':
        case 'Cancelled':
        case 'Backordered':
            event.ID = _event.sellerID;
            _conn.sendUTF(JSON.stringify(event));
            event.ID = _event.providerID;
            _conn.sendUTF(JSON.stringify(event));
        break;
        default:
        break;
    }

}
EN

回答 1

Stack Overflow用户

发布于 2017-12-01 20:55:48

虽然无法确定这个问题的根本原因,但随着hyperledger-composer V0.15.2的发布(并升级到),这个问题已经消失了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47227265

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档