在浏览器环境中调用 dd
(钉钉 JSAPI)获取授权码时,若不在钉钉客户端内会抛出异常。为避免此问题,我们可先封装一个判断当前是否运行于钉钉环境的工具函数。
import * as dd from 'dingtalk-jsapi';
/**
* 判断当前是否为钉钉环境
* @returns {boolean}
*/
export const isDingTalkEnv = () => {
return dd.env.platform !== 'notInDingTalk';
};
使用示例:
import { isDingTalkEnv } from "@/utils/dingTalk.js";
const loginByDingTalk = async () => {
if (isDingTalkEnv()) {
try {
const codeRes = await dd.requestAuthCode({
corpId: corpId,
clientId: clientId
});
await userStore.dingTalkLogin(codeRes.code);
const query = route.query;
const otherQueryParams = Object.keys(query).reduce((acc, cur) => {
if (cur !== "redirect") {
acc[cur] = query[cur];
}
return acc;
}, {});
router.push({ path: redirect.value || "/", query: otherQueryParams });
} catch (e) {
console.error(e);
}
} else {
console.log('当前非钉钉环境');
}
};
通过 dd.env.platform
可以判断当前页面是否运行在钉钉容器中,从而决定是否调用钉钉相关 API,有效避免异常和兼容性问题。该方法适用于需要钉钉上下文支持的功能调用场景。