检查字符串是否在javascript中的列表中不起作用(在Hyperledger中)

时间:2018-06-20 11:46:32

标签: javascript blockchain hyperledger

因此,我想检查广告是否在使用JavaScript的允许网站上显示。我使用了该帖子Determine if string is in list in JavaScript中介绍的方法。

这是我的代码:

async function ImpCertification(tx) {

    Impression = await getAssetRegistry('org.example.basic.Impression')

    const source = Impression.PrintedSite

    whitelist = ["Youtube", "Google", "Facebook", "Twitter"]

    if (whitelist.indexOf(source) < 0) {
        // Checks if source in whitelist
        throw new Error ('This impression does not respect branding')
    }

    // Checks every necessary conditions to validate impression
    if (whitelist.indexOf(source) >=0) {
        // Save the old value of the asset.
        const oldValue = Impression.Valid;

        // Update the asset with the new value.
        Impression.Valid = true;

        // Get the asset registry for the asset.
        const assetRegistry = await getAssetRegistry('org.example.basic.transaction.ValidateImpression');
        // Update the asset in the asset registry.
        await assetRegistry.update(Impression);

        // Emit an event for the modified asset.
        let event = getFactory().newEvent('org.example.basic', 'Validation');
        event.asset = tx.asset;
        event.oldValue = oldValue;
        event.newValue = true;
        emit(event);
    }
    await null
}

我正在开发一个超级账本业务网络,因此某些部分可能看起来有些奇特,但我必须引起您对白名单/ indexOf的关注。尽管我明白了它的逻辑,但它根本不起作用。

我试图在Impression.PrintedSite中输入白名单的每个元素,但无论是否正确,每次都会抛出“此印象不尊重品牌”错误。

在您询问之前,我检查了Impression.PrintedSite中的大写字母,它是一个字符串,我尝试了使用booleans和“ includes”建议的另一种方法,但是它不起作用。暂停!

2 个答案:

答案 0 :(得分:0)

首先,请确保传递给indexOf的字符串是实际字符串:

typeof <your-string-variable> === 'string'

要检查字符串是否在列表中,建议使用ES6 Array.prototype.includes()

['a', 'b', 'c'].includes('b')

要检查字符串是否为列表中字符串的子字符串,请结合使用Array.prototype.includes()方法和String.prototype.includes()方法:

(我还在那里使用了ES6 reduce来简化表达式)

['hello', 'world', 'my', 'name', 'is', 'johny', 'cash'].reduce((current, item) => current || item.includes('substring_to_search'), false);

答案 1 :(得分:0)

长话短说,由于函数中未填充对象“印象”的ID,因此该常量只是空的,因为获取的信息不存在。

因此,由于null不在白名单中,因此indexof返回-1,并且每次程序进入此条件并返回错误时。

这个简单的解决方法是

async function ImpCertification(ValidateImpression) {
    imp = ValidateImpression.impression
    const source = imp.PrintedSite

    ect...

}

其中“ ValidateImpression”是通过ID指向展示资产的交易

asset Impression identified by ImpID {
    o String ImpID
    o String PrintedSite
}    

transaction ValidateImpression {
        --> Impression impression
}