You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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>

解决方案

核心问题分析

  1. recordId值为空:Lightning主页没有绑定任何具体记录,因此组件的@api recordId不会自动获取当前登录用户ID,传入Apex的参数为空,直接触发查询无结果的错误。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 16:35:36