如何在Salesforce社区页面的LWC中获取登录用户及关联数据?
问题描述
项目需求
- 必须在Salesforce社区页面运行(当前在Lightning主页测试)
- 必须显示关联记录的字段列表
相关数据结构
- User对象包含
Account_Id__c字段,用于存储Account的ID - Location_Data__c记录与Account关联
- 需要获取该Account下所有Location的名称和URL字段
遇到的问题
在Lightning主页测试时始终无法获取用户数据,尝试过依赖Wire的方案,但了解到Wire无法在Lightning主页使用。报错信息:
List has no rows for assignment to SObject
Class.UserDetailsController.getUserDetails: line 4, column 1
当前代码无法显示任何数据:
Apex 类
public with sharing class UserDetailsController { @AuraEnabled(cacheable=true) public static User getUserDetails(String userRecordId) { return [SELECT Name, Account_Id__c FROM User WHERE Id = :userRecordId LIMIT 1]; } }
JavaScript 代码
import { LightningElement, api } from 'lwc'; import getUserDetails from '@salesforce/apex/UserDetailsController.getUserDetails'; export default class UserDetailsCard extends LightningElement { @api recordId; userName; accountId; connectedCallback() { // Fetch the user details when the component is loaded. this.fetchUserDetails(); } async fetchUserDetails() { try { // Fetch the user record using the apex method. const userRecord = await getUserDetails({ userRecordId: this.recordId }); if (userRecord) { this.userName = userRecord.Name; this.accountId = userRecord.Account_Id__c; } else { console.error('User not found.'); } } catch (error) { // Handle any errors here. console.error('Error fetching user details:', error); } } }
HTML 代码
<template> <lightning-card title="User Details"> <div class="slds-p-around_medium"> <p><b>Name:</b> {userName}</p> <p><b>Account ID:</b> {accountId}</p> <p><b>Errors:</b> {errors}</p> </div> </lightning-card> </template>
解决方案
核心问题分析
recordId值为空:Lightning主页没有绑定任何具体记录,因此组件的@api recordId不会自动获取当前登录用户ID,传入Apex的参数为空,直接触发查询无结果的错误。- Wire的误解:Wire可以在Lightning主页使用,获取当前用户信息完全可以通过Wire结合系统提供的用户ID引用实现,无需依赖
recordId。
修正方案
方案1:Apex直接获取当前登录用户(推荐)
修改Apex类,无需传入用户ID,直接通过UserInfo.getUserId()获取当前用户:
public with sharing class UserDetailsController { @AuraEnabled(cacheable=true) public static User getUserDetails() { return [SELECT Name, Account_Id__c FROM User WHERE Id = :UserInfo.getUserId() LIMIT 1]; } }
对应修改JavaScript,去掉recordId依赖:
import { LightningElement } from 'lwc'; import getUserDetails from '@salesforce/apex/UserDetailsController.getUserDetails'; export default class UserDetailsCard extends LightningElement { userName; accountId; connectedCallback() { this.fetchUserDetails(); } async fetchUserDetails() { try { const userRecord = await getUserDetails(); if (userRecord) { this.userName = userRecord.Name; this.accountId = userRecord.Account_Id__c; } else { console.error('用户未找到'); } } catch (error) { console.error('获取用户详情失败:', error); } } }
方案2:使用Wire直接获取用户信息(无需Apex)
如果不需要自定义业务逻辑,直接用LWC的Wire服务获取当前用户数据,更简洁:
import { LightningElement, wire } from 'lwc'; import { getRecord } from 'lightning/uiRecordApi'; import USER_ID from '@salesforce/user/Id'; import NAME_FIELD from '@salesforce/schema/User.Name'; import ACCOUNT_ID_FIELD from '@salesforce/schema/User.Account_Id__c'; export default class UserDetailsCard extends LightningElement { @wire(getRecord, { recordId: USER_ID, fields: [NAME_FIELD, ACCOUNT_ID_FIELD] }) user({ error, data }) { if (data) { this.userName = data.fields.Name.value; this.accountId = data.fields.Account_Id__c.value; } else if (error) { console.error('获取用户信息失败:', error); } } userName; accountId; }
HTML代码保持不变即可。
扩展:获取关联的Location数据
拿到accountId后,可扩展Apex方法获取对应的Location_Data__c记录:
@AuraEnabled(cacheable=true) public static List<Location_Data__c> getLocationsByAccountId(String accountId) { return [SELECT Name, URL__c FROM Location_Data__c WHERE Account__c = :accountId]; }
在LWC中调用该方法,将返回的Location列表渲染到页面即可完成需求。
内容的提问来源于stack exchange,提问作者rmoody
相关产品推荐
相关产品推荐

