React TypeScript调用Xrm WebApi报‘Xrm未定义’,如何获取Dynamics 365环境变量
问题原因
- 类型定义缺失:TypeScript编译器无法识别全局
Xrm对象,因为Xrm是Dynamics 365客户端运行时注入的全局变量,本地VS Code环境默认没有对应的类型声明文件,导致编译时提示“Xrm not defined”。 - 运行环境不匹配:如果直接在VS Code里执行这段代码,本地环境没有加载Dynamics 365的客户端框架,
Xrm对象本身就不存在,运行时必然报错。
解决方法
1. 用于Dynamics 365 Web资源开发(代码将在Dynamics客户端运行)
- 安装官方TypeScript类型定义:
在项目根目录执行以下npm命令,添加Dynamics 365的类型声明:
安装后,TypeScript就能识别npm install @types/xrm --save-devXrm的类型结构,消除代码中的错误提示。 - 正确部署运行:这段代码不能在本地VS Code环境直接执行,必须打包成Web资源(比如把TS编译为JS),上传到Dynamics 365后,在表单、Web资源等客户端场景中调用。
2. 本地测试/非客户端环境调用(直接调用Dataverse Web API)
如果需要在本地环境获取环境变量,不要依赖Xrm.WebApi,直接调用Dataverse的Web API端点即可,示例代码如下:
async function GetEnvironmentVariableValue(name: string): Promise<string | null> { const environmentUrl = "https://your-org.crm.dynamics.com"; // 替换为你的Dataverse环境URL const accessToken = "your-valid-access-token"; // 需通过Azure AD获取有效的访问令牌 try { const response = await fetch( `${environmentUrl}/api/data/v9.2/environmentvariabledefinitions?$filter=schemaname eq '${name}'&$select=environmentvariabledefinitionid&$expand=environmentvariabledefinition_environmentvariablevalue($select=value)`, { method: "GET", headers: { "Authorization": `Bearer ${accessToken}`, "Accept": "application/json" } } ); if (!response.ok) throw new Error(`请求失败,状态码:${response.status}`); const results = await response.json(); if (!results?.value || results.value.length === 0) return null; const variable = results.value[0]; if (!variable?.environmentvariabledefinition_environmentvariablevalue || variable.environmentvariabledefinition_environmentvariablevalue.length === 0) return null; return variable.environmentvariabledefinition_environmentvariablevalue[0].value; } catch (error) { console.error("获取环境变量出错:", error); return null; } }
- 注意:需要先通过Azure AD认证获取Dataverse的访问令牌,且令牌对应的权限需包含
environmentvariabledefinition实体的读取权限。
内容的提问来源于stack exchange,提问作者Allenizer
相关产品推荐
相关产品推荐

