Angular 15升级至17后调用deserialize()触发Vite内部服务器错误
升级项目从Angular 15到17后,持续出现以下Vite内部服务器错误:
[vite] Internal server error: Cannot convert undefined or null to object
at Function.getPrototypeOf ()
at node_modules/whatwg-url/lib/utils.js (/home/dej/src/hi-frontend/node_modules/whatwg-url/lib/utils.js:34:39)
at __require2 (/home/dej/src/hi-frontend/.angular/vite-root/hi-frontend/chunk-LO3AJX6B.mjs:54:50)
at node_modules/whatwg-url/lib/URL.js (/home/dej/src/hi-frontend/node_modules/whatwg-url/lib/URL.js:4:15)
at __require2 (/home/dej/src/hi-frontend/.angular/vite-root/hi-frontend/chunk-LO3AJX6B.mjs:54:50)
at node_modules/whatwg-url/webidl2js-wrapper.js (/home/dej/src/hi-frontend/node_modules/whatwg-url/webidl2js-wrapper.js:3:13)
at __require2 (/home/dej/src/hi-frontend/.angular/vite-root/hi-frontend/chunk-LO3AJX6B.mjs:54:50)
at node_modules/whatwg-url/index.js (/home/dej/src/hi-frontend/node_modules/whatwg-url/index.js:3:34)
at __require2 (/home/dej/src/hi-frontend/.angular/vite-root/hi-frontend/chunk-LO3AJX6B.mjs:54:50)
at node_modules/jsdom/lib/api.js (/home/dej/src/hi-frontend/node_modules/jsdom/lib/api.js:7:19) (x2)
经排查,错误由调用new User().deserialize(user)触发,项目中所有调用deserialize()方法的位置均出现该问题。例如服务中的get方法:
getUser(): Observable<User> { let url = this.domain + this.prefix + '/user/'; return this.http.get<User>(url).pipe( map(user => new User().deserialize(user)) ); }
若不调用deserialize()处理服务器响应,错误会消失,但该方法已在项目中大量使用,无法直接移除。
User类定义如下:
export interface Deserializable { deserialize(input: any): this; } export class User implements Deserializable { id: number; deserialize(input: any): this { Object.assign(this, input); return this; } getId() { return this.id; } }
尝试在deserialize()中添加空值校验后,问题仍未解决:
deserialize(input: any): this { if (input == null || input == undefined) return this; Object.assign(this, input); return this; }
请问该错误的原因是什么?
内容的提问来源于stack exchange,提问作者Dejan S

