因此,我想检查广告是否在使用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”建议的另一种方法,但是它不起作用。暂停!
答案 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
}