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

Flutter集成Appwrite遇document_not_found(404)错误,急求解决

排查与修复Appwrite document_not_found 404错误

这个错误的核心是你请求的Appwrite文档不存在,结合你的场景(获取当前用户数据),问题大概率出在用户数据的存储逻辑或Provider实现上,以下是具体排查和修复步骤:


1. 检查currentUserDetailsProvider的实现逻辑

你贴的UI代码只是调用Provider,真正的请求逻辑在currentUserDetailsProvider里,常见问题:

  • 如果Provider是通过Appwrite用户ID查询数据库文档(比如db.getDocument(collectionId: 'users', documentId: currentUser.$id)),但数据库中没有对应该用户ID的文档。
  • 集合ID、文档ID拼写错误,导致请求了不存在的资源。

举个错误示例:

// 错误情况:用户注册时只创建了Appwrite账号,没在数据库创建对应文档
final currentUserDetailsProvider = FutureProvider<UserModel>((ref) async {
  final auth = ref.watch(appwriteAuthProvider);
  final db = ref.watch(appwriteDatabaseProvider);
  final currentUser = await auth.getCurrentUser();
  // 这里查询数据库,但数据库没有该ID的文档,直接抛出404
  final doc = await db.getDocument(collectionId: 'users', documentId: currentUser!.$id);
  return UserModel.fromMap(doc.data);
});

2. 补全用户数据存储流程

确保用户注册时,同时创建Appwrite账号和数据库用户文档:

// 注册流程示例
Future<void> signUp(String email, String password, String name) async {
  final auth = AppwriteAuth.instance;
  final db = AppwriteDatabase.instance;
  // 1. 创建Appwrite账号
  final user = await auth.createUser(
    email: email,
    password: password,
    name: name,
  );
  // 2. 在数据库users集合中创建对应文档(用用户ID作为文档ID)
  await db.createDocument(
    collectionId: 'users',
    documentId: user.$id,
    data: {
      'name': name,
      'email': email,
      'profilePic': 'https://默认头像地址',
    },
  );
}

3. 修正Provider的错误处理逻辑

你当前的代码只取了.value,忽略了FutureProvider的错误状态,导致异常直接抛出。应该用when方法处理所有状态:

@override
Widget build(BuildContext context) {
  final currentUserAsync = ref.watch(currentUserDetailsProvider);
  return Scaffold(
    appBar: AppBar(
      leading: IconButton(
        onPressed: () {},
        icon: const Icon(Icons.close, size: 30, color: Colors.black),
      ),
      actions: [
        RoundedSmallButton(
          onTap: () {},
          label: 'Post',
          backgroundColor: Pallete.pinkColor,
          TextColor: Pallete.whiteColor,
        ),
      ],
    ),
    body: currentUserAsync.when(
      loading: () => const Loader(),
      error: (error, stackTrace) {
        // 显示错误提示
        WidgetsBinding.instance.addPostFrameCallback((_) {
          ScaffoldMessenger.of(context).showSnackBar(
            SnackBar(content: Text('加载失败:${error.toString()}')),
          );
        });
        return const Center(child: Text('加载失败,请重试'));
      },
      data: (currentUser) {
        return SafeArea(
          child: SingleChildScrollView(
            child: Column(
              children: [
                Row(
                  children: [
                    CircleAvatar(
                      backgroundImage: NetworkImage(currentUser.profilePic),
                      radius: 30,
                    ),
                  ],
                )
              ],
            ),
          ),
        );
      },
    ),
  );
}

4. 验证Appwrite集合权限

检查Appwrite控制台的数据库集合权限:

  • 确保添加规则:允许user角色读取文档,且条件设置为$id == user.$id(保证用户只能读取自己的文档)。
  • 避免权限配置错误导致的"权限不足伪装成404"情况。

内容的提问来源于stack exchange,提问作者Balkis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 12:45:24