使用try/catch与async/await仍出现Appwrite未授权控制台错误
问题原因与解决方案
为什么catch块没拦截到错误,控制台仍出现未授权提示?
- Appwrite SDK自带日志输出:
account.get()在未授权时,Appwrite的SDK会在底层主动将错误日志打印到控制台,这个日志不属于你代码中try/catch捕获的异常输出,所以即使你捕获了异常,SDK自身的日志还是会显示。 getCurrentUser未向上层抛出异常:你的getCurrentUser函数在catch块中返回了null,没有重新抛出错误,因此handleClick中的catch块不会被触发——因为getCurrentUser没有抛出异常,而是正常返回了null。
解决方法
1. 关闭Appwrite SDK的自带日志
在初始化Appwrite客户端时,通过设置日志级别来屏蔽SDK自身的错误输出:
import { Client, Account, LogLevel } from "appwrite"; const client = new Client() .setEndpoint('你的Appwrite端点') .setProject('你的项目ID') .setLogLevel(LogLevel.NONE); // 完全关闭SDK日志,也可根据需求选LogLevel.ERROR只保留错误级日志 const account = new Account(client);
2. 调整代码逻辑(按需选择)
- 只保留自定义日志提示:如果不需要上层
handleClick处理异常,保持现有逻辑即可,关闭SDK日志后控制台只会显示你catch中的提示:
export async function getCurrentUser() { try { const user = await account.get(); return user; } catch (err) { console.log("no user found : ", err.message || err); return null; } }
- 让上层
handleClick捕获异常:如果需要handleClick的catch块也能处理错误,可在getCurrentUser的catch中重新抛出异常:
export async function getCurrentUser() { try { const user = await account.get(); return user; } catch (err) { console.log("no user found : ", err.message || err); throw err; // 抛出错误,让上层catch捕获 } }
3. 用useEffect检查会话并更新状态
按照你的需求,可通过useEffect在组件加载时自动检查用户会话:
import { useState, useEffect } from 'react'; function YourComponent() { const [currentUser, setCurrentUser] = useState(null); useEffect(() => { const checkUserSession = async () => { const user = await getCurrentUser(); setCurrentUser(user); }; checkUserSession(); }, []); // 后续可根据currentUser状态渲染对应UI return ( <div> {currentUser ? <p>当前用户:{currentUser.name}</p> : <p>未登录</p>} <button onClick={handleClick}>检查用户</button> </div> ); }
内容的提问来源于stack exchange,提问作者Pratik Kumar Patra
相关产品推荐
相关产品推荐

