Javascript 如何通过代码更新SFCC中自定义属性(字符串枚举)的值?

Javascript 如何通过代码更新SFCC中自定义属性(字符串枚举)的值?,javascript,jquery,demandware,Javascript,Jquery,Demandware,要求:我想通过代码更新产品的自定义属性(名称:徽章)(类型:字符串枚举)的值。我想将“畅销书”的值设置为选中值。由于下面的代码不起作用,我应该如何进行更新 代码段: function updateBestSeller() { var ProductMgr = require('dw/catalog/ProductMgr'); var Site = require('dw/system/Site'); var UUIDUtils = require('dw/util/UUIDUtils'); v

要求:我想通过代码更新产品的自定义属性(名称:徽章)(类型:字符串枚举)的值。我想将“畅销书”的值设置为选中值。由于下面的代码不起作用,我应该如何进行更新

代码段:

function updateBestSeller() {
var ProductMgr = require('dw/catalog/ProductMgr');
var Site = require('dw/system/Site');
var UUIDUtils = require('dw/util/UUIDUtils');
var CustomObjectMgr = require('dw/object/CustomObjectMgr');
var currentSite = Site.getCurrent();
var bestSellerOrderUnits = Object.hasOwnProperty.call(currentSite.preferences.custom, 'bestSellerOrderUnits') ? currentSite.getCustomPreferenceValue('bestSellerOrderUnits') : 0;
try {
        Transaction.wrap(function () {
            var count = 1;
            var products = ProductMgr.queryAllSiteProducts();sni
            var HashSet = require('dw/util/HashSet');
             var badges = new HashSet();
            if (products.count > 0) {
                while (products.hasNext() && count < 5) {
                    var product = products.next();
                        var badges = [];
                        badges.push('bestSeller');
                        if (Object.hasOwnProperty.call(product.custom, 'badges')) {
                            product.custom.badges = badges
                        }
                        count++;
                        Logger.debug('{0}',product.ID);
                }
            }
            products.close();
        });
} catch (ex) {
    Logger.error(ex.toString());
    return new Status(Status.ERROR, 'ERROR', 'UPDATE failed');
}
return new Status(Status.OK, 'OK', 'UPDATE successful');
函数updateBestSeller(){
var ProductMgr=require('dw/catalog/ProductMgr');
var站点=要求('dw/系统/站点');
var UUIDUtils=require('dw/util/UUIDUtils');
var CustomObjectMgr=require('dw/object/CustomObjectMgr');
var currentSite=Site.getCurrent();
var bestSellerOrderRunits=Object.hasOwnProperty.call(currentSite.preferences.custom,'BestSellerOrderRunits')?currentSite.getCustomPreferenceValue('BestSellerOrderRunits'):0;
试一试{
Transaction.wrap(函数(){
var计数=1;
var products=ProductMgr.queryAllSiteProducts();sni
var HashSet=require('dw/util/HashSet');
var badges=newhashset();
如果(products.count>0){
while(products.hasNext()&&count<5){
var product=products.next();
var徽章=[];
徽章。推送(“畅销书”);
if(Object.hasOwnProperty.call(product.custom,'badges')){
product.custom.徽章=徽章
}
计数++;
debug(“{0}”,product.ID);
}
}
products.close();
});
}捕获(ex){
Logger.error(例如toString());
返回新状态(Status.ERROR,“ERROR”,“UPDATE failed”);
}
返回新状态(Status.OK,‘OK’、‘更新成功’);

}

我认为这里可能发生的情况是,您试图验证产品在
产品中是否有
徽章
密钥。自定义
属性集合失败。这样可以防止发生更新

我建议删除以下行周围的条件:
product.custom.徽章=徽章

如果不执行该行,则数据库的更新将永远不会发生

自定义属性的工作方式是,在为给定持久对象的属性设置值之前,它们永远不会存在。(例如:产品)因此,通过类似于:
产品中的“徽章”的方式来检查它是否存在。即使存在自定义属性定义,自定义
(这是推荐的方式)通常也会是
错误的
,因为许多产品从未设置过徽章值。一旦一个对象将一个值设置为一个特定的自定义属性,即使它现在被设置为
null
,它也将存在

此外,代码中还有一些其他问题可能会导致问题。一个例子是在同一范围内两次定义
badges
变量。另一个例子是
sni
,它位于定义
products
变量的行的末尾。这可能会导致代码中出现错误。最后,如果可以的话,最好避免使用
queryalsiteproducts
方法。另一种选择可能是使用;这可能并不总是满足您的需要,但出于性能原因,在求助于
queryalsiteproducts
之前,最好先排除它

需要考虑的是,如果<代码>徽章< /代码>当前有任何选定的值,那么您将用今天的代码重写这些值。考虑将<代码>徽章最初设置为<代码> []/Cord>,然后检查是否有该产品的值:

if ('badges' in product.custom && !empty(product.custom.badges) {
  badges = product.custom.badges;
}

谢谢@sholsinger。”CSUTOMERPERTY'在product.custom中-重要检查,我们总是错过。