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

9 回复

来个活人呀

更多关于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 官方的人来修吧

微信上没有问题,是因为 uniapp 这边注入进来的全局对象就是微信的全局对象,uniapp 注入微信的的代码如下:
/* WEBPACK VAR INJECTION */(function(global, uni) {

//.......省略  

/* 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-weixin/dist/index.js */ 1)[“default”])) 得到的 global 对象是
global
Window {window: Window, self: Window, document: HTMLDocument, location: Location, top: Window, …}

Symbol
ƒ Symbol() { [native code] } 然而 uniapp 注入支付宝小程序的代码如下
/* WEBPACK VAR INJECTION */(function(global, uni) {Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var commonjsGlobal=typeof globalThis!==‘undefined’?globalThis:typeof window!==‘undefined’?window:typeof global!==‘undefined’?global:typeof self!==‘undefined’?self:{};

//…省略

/* 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”])) 这边得到的 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) 如此导致我的代码里有 corejs 注入的关于 symbol 的判断,而支付宝里 Symbol 是 undefined 导致报错。

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

问题分析:

  1. 从错误堆栈看,问题出现在 hasOwnProperty 调用时,传入的 it 参数是 undefined
  2. 你提到的 global 对象缺少 Symbol 属性,这会导致依赖 Symbol 的 polyfill 代码运行异常。
  3. 支付宝小程序环境本身对 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
回到顶部