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

查询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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 03:07:41