日期: 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修复完成! ✨