查询DataStore的subId时出现Promise未处理拒绝错误,如何解决?
解决DataStore查询时的TypeError: Object is not a function错误
错误原因
- 查询语法错误:你使用的
user.sub("eq", sub)不符合Amplify DataStore的查询规则,正确的谓词查询应该通过字段的方法调用,比如eq是sub字段的专属方法,而非将操作符作为参数传入。 - 未处理空值场景:当
authUser还未加载完成时,sub会是null或undefined,此时执行查询会触发无效操作,进而引发错误。
修复后的完整代码
import { createContext, useState, useEffect, useContext } from "react"; import { Auth, DataStore } from 'aws-amplify'; import { User } from "../models"; const AuthContext = createContext({}) const AuthContextProvider = ({ children }) => { const [authUser, setAuthUser] = useState(null) const [dbUser, setDbUser] = useState(null) const sub = authUser?.attributes?.sub; useEffect(() => { Auth.currentAuthenticatedUser({ bypassCache: true }) .then(setAuthUser) .catch(err => console.error("获取认证用户失败:", err)); }, []); useEffect(() => { // 仅在sub有效时执行查询 if (!sub) return; // 修正后的DataStore查询语法 DataStore.query(User, user => user.sub.eq(sub)) .then(users => setDbUser(users[0])) .catch(err => console.error("查询数据库用户失败:", err)); }, [sub]) return ( <AuthContext.Provider value={{ authUser, dbUser, sub, setDbUser }}> {children} </AuthContext.Provider> ) } export default AuthContextProvider; export const useAuthContext = () => useContext(AuthContext)
关键修改说明
- 修正查询语法:将
user.sub("eq", sub)改为user.sub.eq(sub),这是Amplify DataStore定义的标准谓词查询方式,用于匹配sub字段等于目标值的记录。 - 增加空值判断:在查询前先校验
sub是否存在,避免在认证用户信息未加载完成时发起无效查询,减少不必要的错误触发。 - 添加错误捕获:为两个异步操作都补上
.catch()逻辑,处理可能出现的异常,同时避免控制台弹出「未处理的Promise拒绝」警告。
内容的提问来源于stack exchange,提问作者Damini
相关产品推荐
相关产品推荐

