Magento 2升级到2.3.7后结账页ajax请求URL多undefined前缀如何解决
Magento 2.3.7 结账页AJAX URL异常(含undefined前缀)修复方案
根因说明
URL前缀出现undefined的核心原因是Magento 2.3.7版本前端JS的store code配置注入异常,mage/url 模块拼接请求前缀时无法读取到store code配置值,误将undefined作为路径片段拼接,同时未读取到正确的全局base URL时会复用当前页面路径(/checkout/)作为前缀,最终生成错误URL。
可行修复方案
方案1:主题层覆盖url-builder修复前缀拼接逻辑(推荐,不修改核心代码)
- 在自定义主题目录下创建文件:
app/design/frontend/<你的厂商名>/<你的主题名>/Magento_Theme/web/js/url-builder.js - 写入以下代码,重写原有拼接逻辑,过滤undefined值:
define([ 'jquery', 'mage/url' ], function ($, urlBuilder) { 'use strict'; var originalBuild = urlBuilder.build; // 重写build方法,修复undefined路径问题 urlBuilder.build = function (path) { var baseUrl = urlBuilder.getBaseUrl(); // 移除路径开头的undefined片段 path = path.replace(/^undefined/, ''); // 绝对路径直接返回 if (path.indexOf('http') === 0) { return path; } // 规范前后斜杠,避免重复拼接 return baseUrl.replace(/\/+$/, '') + '/' + path.replace(/^\/+/, ''); }; return urlBuilder; });
- 在同主题的
requirejs-config.js中添加配置,优先加载自定义文件:
var config = { map: { '*': { 'mage/url': 'Magento_Theme/js/url-builder' } } };
- 执行静态资源部署和缓存清理命令生效:
php bin/magento setup:static-content:deploy -f php bin/magento cache:clean
方案2:修复store code前端配置注入
如果方案1不生效,可检查并补充前端全局store配置:
- 首先查看页面源码,确认是否存在
window.store全局配置,如code字段为undefined或配置不存在,继续后续操作 - 在主题布局文件
app/design/frontend/<你的厂商名>/<你的主题名>/Magento_Theme/layout/default.xml的<body>节点中添加配置注入代码:
<referenceContainer name="after.body.start"> <block class="Magento\Framework\View\Element\Template" name="store.config.inject" template="Magento_Theme::js/store_config.phtml" /> </referenceContainer>
- 创建对应的phtml模板文件
app/design/frontend/<你的厂商名>/<你的主题名>/Magento_Theme/templates/js/store_config.phtml:
<?php /** @var \Magento\Framework\View\Element\Template $block */ $currentStore = $block->getStoreManager()->getStore(); ?> <script> window.store = window.store || {}; window.store.code = '<?= $block->escapeJs($currentStore->getCode()) ?>'; window.store.id = '<?= $block->escapeJs($currentStore->getId()) ?>'; </script>
- 执行缓存清理命令生效。
方案3:临时验证补丁(不推荐,升级会被覆盖)
如需快速验证问题,可临时修改vendor/magento/module-checkout/view/frontend/web/js/model/shipping-rate-processor/new-address.js,在调用storage.post前添加代码过滤undefined:
serviceUrl = serviceUrl.replace(/undefined/g, '');
内容的提问来源于stack exchange,提问作者nshah143
相关产品推荐
相关产品推荐

