uni-app 运行到支付宝小程序模拟器报 Uncaught TypeError: Cannot convert undefined or null to object
uni-app 运行到支付宝小程序模拟器报 Uncaught TypeError: Cannot convert undefined or null to object
| 开发环境 | 版本号 | 项目创建方式 |
|---|---|---|
| Mac | Big Sur 11.3.1 | HBuilderX |
产品分类:uniapp/小程序/阿里
操作步骤:
npm install nim-web-sdk-ng
import NIMSDK from 'nim-web-sdk-ng/dist/NIM_UNIAPP_SDK'
运行到小程序模拟器-运行到支付宝小程序模拟器
预期结果:
不要报错
实际结果:
Uncaught TypeError: Cannot convert undefined or null to object
at hasOwnProperty (<anonymous>)
at has$1 (vendor.js:formatted:3119)
at wellKnownSymbol (vendor.js:formatted:3218)
at vendor.js:formatted:3235
at vendor.js:formatted:3088
at Object.<anonymous> (vendor.js:formatted:3088)
at Object.CHqb (vendor.js:formatted:6493)
at __webpack_require__ (vendor.js:formatted:22346)
at Object.<anonymous> (vendor.js:formatted:2921)
at Object.CHqb (vendor.js:formatted:2968)
bug描述:
uniapp 运行去支付宝小程序报错
Uncaught TypeError: Cannot convert undefined or null to object
at hasOwnProperty (<anonymous>)
at has$1 (vendor.js:formatted:3119)
at wellKnownSymbol (vendor.js:formatted:3218)
at vendor.js:formatted:3235
at vendor.js:formatted:3088
at Object.<anonymous> (vendor.js:formatted:3088)
at Object.CHqb (vendor.js:formatted:6493)
at __webpack_require__ (vendor.js:formatted:22346)
at Object.<anonymous> (vendor.js:formatted:2921)
at Object.CHqb (vendor.js:formatted:2968)
调试一番得知是 uniapp 注入进支付宝小程序的代码里的 global 对象少了 symbol
/* WEBPACK VAR INJECTION */(function(global, uni) {(function(global,factory){
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../../../../../../Applications/HBuilderX.app/Contents/HBuilderX/plugins/uniapp-cli/node_modules/webpack/buildin/global.js */ 2), __webpack_require__(/*! ./node_modules/@dcloudio/uni-mp-alipay/dist/index.js */ 1)["default"]))
上文这一段就是 uniapp 编译去支付宝里注入进来的代码,看起来 /node_modules/@dcloudio/uni-mp-alipay/dist/index.js 里得到的对象作为 global 注入,少了symbol.
最终让我的在 corejs 里 polyfill 过的库运行 hasOwnProperty 时报错,因为 it 也就是 symbol 被传入了 undefined。下面这段是 corejs 插入的
var has$1 = function (it, key) {
return hasOwnProperty_c.call(it, key);
};
更多关于uni-app 运行到支付宝小程序模拟器报 Uncaught TypeError: Cannot convert undefined or null to object的实战教程也可以访问 https://www.itying.com/category-93-b0.html
来个活人呀
更多关于uni-app 运行到支付宝小程序模拟器报 Uncaught TypeError: Cannot convert undefined or null to object的实战教程也可以访问 https://www.itying.com/category-93-b0.html
报错的文件是af-appx.worker.min.js
再次仔细调试,我自己的依赖被babel+corejs 翻译里有个 commonjsGlobal 的定义,要试探的取 global。
而 uniapp 注入进支付宝的代码里把 global 通过这样的方式注入了进来 Applications/HBuilderX.app/Contents/HBuilderX/plugins/uniapp-cli/node_modules/webpack/buildin/global.js
所以,这样注入进来的 global 只包含了这样的属性
Date: ƒ Date()
Error: ƒ Error()
Function: ƒ (e)
Math: Math {abs: ƒ, acos: ƒ, acosh: ƒ, asin: ƒ, asinh: ƒ, …}
Object: ƒ Object()
Reflect: Reflect {defineProperty: ƒ, deleteProperty: ƒ, apply: ƒ, construct: ƒ, get: ƒ, …}
RegExp: ƒ RegExp()
String: ƒ String()
TypeError: ƒ TypeError()
clearInterval: ƒ (e)
clearTimeout: ƒ (e)
getLocale: ƒ getLocale()
isFinite: ƒ isFinite()
setInterval: ƒ (e,r)
setTimeout: ƒ (e,r)
里面就是没有 symbol。。而真实的支付宝全局环境当然是能得到 global 的。
这个问题在微信没有出现因为微信的 global 没有被这样污染,
哎,实在不知道怎么办了,只能是 uni cloud 官方的人来修吧
var Symbol$2=global$1.Symbol;
var createWellKnownSymbol=useSymbolAsUid?Symbol$2:Symbol$2&&Symbol$2.withoutSetter||uid;
var wellKnownSymbol=function wellKnownSymbol(name){
debugger;
if(!has$1(WellKnownSymbolsStore$1,name)||!(nativeSymbol||typeof WellKnownSymbolsStore$1[name]==‘string’)){
if(nativeSymbol&&has$1(Symbol$2,name)){
WellKnownSymbolsStore$1[name]=Symbol$2[name];
}else{
WellKnownSymbolsStore$1[name]=createWellKnownSymbol(‘Symbol.’+name);
}
最终调试的结果是在 nativeSymbol&&has$1(Symbol$2,name) 上报错了。就是因为 Symbol$2 这个 global 是 uniapp 注入进来的,上面没有 Symbol
在吗大佬 解决了吗 遇到同样的问题了
这个错误通常是由于支付宝小程序环境与某些第三方库的兼容性问题导致的。具体来说,是 nim-web-sdk-ng 或其依赖的 polyfill 代码在访问 global 对象的 Symbol 属性时遇到了 undefined。
问题分析:
- 从错误堆栈看,问题出现在
hasOwnProperty调用时,传入的it参数是undefined。 - 你提到的
global对象缺少Symbol属性,这会导致依赖Symbol的 polyfill 代码运行异常。 - 支付宝小程序环境本身对 ES6+ 特性的支持可能不完整,而
core-js等 polyfill 库会尝试检测并填充这些特性。
解决方案:
方案1:在支付宝小程序中手动注入全局 Symbol
在支付宝小程序入口文件(如 app.js)的最顶部添加:
// 支付宝小程序环境全局Symbol补丁
if (typeof global !== 'undefined' && !global.Symbol) {
global.Symbol = function Symbol() {};
global.Symbol.iterator = '@@iterator';
}
方案2:配置条件编译 针对支付宝小程序环境使用不同的导入方式:
// #ifdef MP-ALIPAY
// 支付宝小程序使用兼容版本
import NIMSDK from 'nim-web-sdk-ng/dist/NIM_UNIAPP_SDK_ALIPAY'
// #endif
// #ifndef MP-ALIPAY
import NIMSDK from 'nim-web-sdk-ng/dist/NIM_UNIAPP_SDK'
// #endif
方案3:检查构建配置
在 vue.config.js 或项目配置中,确保正确配置了 transpileDependencies:
module.exports = {
transpileDependencies: ['nim-web-sdk-ng']
}
方案4:降级 core-js 版本
如果使用了较新版本的 core-js,尝试降级到 3.8.x 或更早的稳定版本:
npm install core-js@3.8.3


