日期: 2025-10-24
问题: 访问项目详情页面时报错 TypeError: Cannot set properties of null (setting 'cid')
http://localhost:4200/admin/project-detail/iKvYck89zE/orderTypeError: Cannot set properties of null (setting 'cid')wxwork.auth.mjs:8:1666wxwork.sdk.mjs:8:4611project-detail.component.ts:236问题:
admin/services/ProjectService,从Parse数据库查询真实数据7EFEsEd0ht, iKvYck89zE 等services/ProjectService,只有模拟数据proj-001, 2, 3 等undefined,导致后续操作失败解决方案:
修改 src/app/services/project.service.ts 的 getProjectById 方法,优先从Parse查询真实数据:
getProjectById(id: string): Observable<Project | undefined> {
return new Observable(observer => {
this.getProjectFromParse(id).then(project => {
if (project) {
observer.next(project);
} else {
// 降级:使用模拟数据
observer.next(this.projects.find(project => project.id === id));
}
observer.complete();
}).catch(error => {
console.error('查询项目失败,使用模拟数据:', error);
observer.next(this.projects.find(project => project.id === id));
observer.complete();
});
});
}
问题:
管理员端项目详情页 (modules/project/pages/project-detail/project-detail.component.ts) 在初始化企微SDK时:
// ❌ 旧代码
async initWxworkAuth() {
let cid = this.cid || localStorage.getItem("company") || "";
this.wxAuth = new WxworkAuth({ cid: cid}); // cid为空时会报错
this.wxwork = new WxworkSDK({ cid: cid, appId: 'crm' });
this.wecorp = new WxworkCorp(cid);
}
原因:
/admin/project-detail/:projectId,没有 :cid 参数this.cid 从路由获取为空localStorage.getItem("company") 也为空,cid 就是空字符串WxworkSDK 导致内部初始化失败:Cannot set properties of null (setting 'cid')错误链:
ngOnInit()
→ initWxworkAuth()
→ new WxworkSDK({ cid: "" })
→ 内部尝试设置 null.cid
→ TypeError
文件: src/modules/project/pages/project-detail/project-detail.component.ts
修改点:
async initWxworkAuth() {
try {
let cid = this.cid || localStorage.getItem("company") || "";
// ✅ 如果没有cid,记录警告但不抛出错误
if (!cid) {
console.warn('⚠️ 未找到company ID (cid),企微功能将不可用');
return; // 不初始化SDK,避免错误
}
this.wxAuth = new WxworkAuth({ cid: cid });
this.wxwork = new WxworkSDK({ cid: cid, appId: 'crm' });
this.wecorp = new WxworkCorp(cid);
console.log('✅ 企微SDK初始化成功,cid:', cid);
} catch (error) {
console.error('❌ 企微SDK初始化失败:', error);
// 不阻塞页面加载
}
}
// 2. 获取当前用户(优先从全局服务获取)
if (!this.currentUser?.id && this.wxAuth) {
try {
this.currentUser = await this.wxAuth.currentProfile();
} catch (error) {
console.warn('⚠️ 获取当前用户Profile失败:', error);
}
}
文件: src/app/pages/designer/project-detail/project-detail.ts
修改点:在 constructor 中添加企微认证初始化
constructor(
private route: ActivatedRoute,
private projectService: ProjectService,
private router: Router,
private fb: FormBuilder,
private cdr: ChangeDetectorRef,
private paymentVoucherService: PaymentVoucherRecognitionService,
private projectReviewService: ProjectReviewService,
private colorAnalysisService: ColorAnalysisService
) {
// 初始化企业微信认证
this.loadProfile();
}
// 当前用户信息
currentUser: any = {};
/**
* 加载当前用户Profile
*/
async loadProfile() {
try {
const cid = localStorage.getItem("company");
if (cid) {
const { WxworkAuth } = await import('fmode-ng/core');
const wwAuth = new WxworkAuth({ cid: cid });
const profile = await wwAuth.currentProfile();
if (profile) {
this.currentUser = {
name: profile.get("name") || profile.get("mobile"),
avatar: profile.get("avatar"),
roleName: profile.get("roleName")
};
console.log('✅ 用户Profile加载成功:', this.currentUser);
}
} else {
console.warn('⚠️ localStorage中未找到company(cid)');
}
} catch (error) {
console.error('❌ 加载用户Profile失败:', error);
}
}
✅ src/app/services/project.service.ts
getProjectById() 方法getProjectFromParse() 私有方法✅ src/modules/project/pages/project-detail/project-detail.component.ts
initWxworkAuth() 方法,添加cid空值检查loadData() 方法,添加获取用户错误处理✅ src/app/pages/designer/project-detail/project-detail.ts
loadProfile() 方法currentUser 属性根据 rules/wxwork/auth.md 和 rules/wxwork/guard-wxwork.md:
// ✅ 正确
const cid = localStorage.getItem("company");
if (cid) {
const wxAuth = new WxworkAuth({ cid: cid });
}
// ❌ 错误:可能传入空字符串
const cid = this.cid || ""; // cid可能为空
const wxAuth = new WxworkAuth({ cid: cid }); // 会报错
客服端 (customer-service/dashboard/dashboard.ts):
async loadProfile() {
let cid = localStorage.getItem("company");
if (cid) {
let wwAuth = new WxworkAuth({cid:cid})
let profile = await wwAuth.currentProfile();
this.currentUser = {
name: profile?.get("name") || profile?.get("mobile"),
avatar: profile?.get("avatar"),
roleName: profile?.get("roleName")
}
}
}
管理员端 (admin/dashboard/dashboard.ts):
import { WxworkAuth } from 'fmode-ng/core';
// 使用时先检查cid
// ✅ 推荐:try-catch包裹,不阻塞页面
try {
const cid = localStorage.getItem("company");
if (!cid) {
console.warn('未找到cid,企微功能不可用');
return; // 提前返回,不初始化
}
const wxAuth = new WxworkAuth({ cid });
// ... 其他初始化
} catch (error) {
console.error('初始化失败:', error);
// 页面仍然可以继续加载
}
清除localStorage中的company
localStorage.removeItem("company");
访问管理员项目详情页
http://localhost:4200/admin/project-detail/iKvYck89zE/order
预期结果
⚠️ 未找到company ID (cid),企微功能将不可用设置cid后重新测试
localStorage.setItem("company", "cDL6R1hgSi"); // 使用真实的公司ID
刷新页面
rules/wxwork/guard-wxwork.md - 企业微信路由守卫使用指南rules/wxwork/auth.md - 企业微信认证方法文档docs/task/2025102216-team-leader-database-integration.md - Parse数据库集成文档TypeError: Cannot set properties of null修复完成! ✨