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

Nuxt3中Firestore创建文档触发GrpcConnection错误求助

Firestore写入文档时触发NOT_FOUND错误(Code:5)

问题描述

在Nuxt3应用中使用Firebase/Firestore SDK向数据库存储新文档时,持续触发以下错误:

@firebase/firestore: Firestore (10.11.0): GrpcConnection RPC 'Write' stream 0x29b0fa74 error. Code: 5 Message: 5 NOT_FOUND:

数据存储代码如下:

export const add = async (col: string, document: Object) => {
  // @ts-ignore
  const colRef = collection(firestoreDb, col);

  const docRef = await addDoc(colRef, document);

  return docRef;
};

补充日志信息:

Firestore实例日志

Firestore {
  _authCredentials:
   FirebaseAuthCredentialsProvider {
     authProvider:
      Provider {
        name: 'auth-internal',
        container: [ComponentContainer],
        component: null,
        instances: Map(0) {},
        instancesDeferred: Map(0) {},
        instancesOptions: Map(0) {},
        onInitCallbacks: Map(0) {} },
     currentUser: User { uid: null },
     tokenCounter: 0,
     forceRefresh: false,
     auth: null },
  _appCheckCredentials:
   FirebaseAppCheckTokenProvider {
     appCheckProvider:
      Provider {
        name: 'app-check-internal',
        container: [ComponentContainer],
        component: null,
        instances: Map(0) {},
        instancesDeferred: Map(0) {},
        instancesOptions: Map(0) {},
        onInitCallbacks: Map(0) {} },
     forceRefresh: false,
     appCheck: null,
     latestAppCheckToken: null },
  _databaseId: DatabaseId { projectId: 'activityapp-419511', database: '(default)' },
  _app:
   FirebaseAppImpl {
     _isDeleted: false,
     _options:
      { apiKey: 'AIzaSyAQVJufWha_adYk879BEpM4BwUl4XggkEc',
        authDomain: 'activityapp-419511.firebaseapp.com',
        databaseURL: undefined,
        projectId: 'activityapp-419511',
        storageBucket: 'activityapp-419511.appspot.com',
        messagingSenderId: '412317674095',
        appId: '1:412317674095:web:6792a01c7499d1ce44fb9a' },
     _config: { name: 'server', automaticDataCollectionEnabled: false },
     _name: 'server',
     _automaticDataCollectionEnabled: false,
     _container: ComponentContainer { name: 'server', providers: [Map] } },
  type: 'firestore',
  _persistenceKey: 'server',
  _settings:
   FirestoreSettingsImpl {
     host: 'firestore.googleapis.com',
     ssl: true,
     credentials: undefined,
     ignoreUndefinedProperties: false,
     localCache: undefined,
     cacheSizeBytes: 41943040,
     experimentalForceLongPolling: false,
     experimentalAutoDetectLongPolling: true,
     experimentalLongPollingOptions: {},
     useFetchStreams: true },
  _settingsFrozen: false,
  _queue:
   <ref *1> AsyncQueueImpl {
     tail: Promise { undefined },
     retryableOps: [],
     _isShuttingDown: false,
     delayedOperations: [],
     failure: null,
     operationInProgress: false,
     skipNonRestrictedTasks: false,
     timerIdsToSkip: [],
     backoff:
      ExponentialBackoff {
        queue: [Circular *1],
        timerId: 'async_queue_retry',
        initialDelayMs: 1000,
        backoffFactor: 1.5,
        maxDelayMs: 60000,
        currentBaseMs: 0,
        timerPromise: null,
        lastAttemptTime: 1714043517590 },
     visibilityHandler: [Function (anonymous)] } }

CollectionReference日志

CollectionReference {
  converter: null,
  _query:
   QueryImpl {
     path: ResourcePath { segments: [Array], offset: 0, len: 1 },
     collectionGroup: null,
     explicitOrderBy: [],
     filters: [],
     limit: null,
     limitType: 'F',
     startAt: null,
     endAt: null,
     memoizedNormalizedOrderBy: null,
     memoizedTarget: null,
     memoizedAggregateTarget: null },
  type: 'collection',
  firestore:
   Firestore {
     _authCredentials:
      FirebaseAuthCredentialsProvider {
        authProvider: [Provider],
        currentUser: [User],
        tokenCounter: 0,
        forceRefresh: false,
        auth: null },
     _appCheckCredentials:
      FirebaseAppCheckTokenProvider {
        appCheckProvider: [Provider],
        forceRefresh: false,
        appCheck: null,
        latestAppCheckToken: null },
     _databaseId: DatabaseId { projectId: 'activityapp-419511', database: '(default)' },
     _app:
      FirebaseAppImpl {
        _isDeleted: false,
        _options: [Object],
        _config: [Object],
        _name: 'server',
        _automaticDataCollectionEnabled: false,
        _container: [ComponentContainer] },
     type: 'firestore',
     _persistenceKey: 'server',
     _settings:
      FirestoreSettingsImpl {
        host: 'firestore.googleapis.com',
        ssl: true,
        credentials: undefined,
        ignoreUndefinedProperties: false,
        localCache: undefined,
        cacheSizeBytes: 41943040,
        experimentalForceLongPolling: false,
        experimentalAutoDetectLongPolling: true,
        experimentalLongPollingOptions: {},
        useFetchStreams: true },
     _settingsFrozen: false,
     _queue:
      AsyncQueueImpl {
        tail: [Promise],
        retryableOps: [],
        _isShuttingDown: false,
        delayedOperations: [],
        failure: null,
        operationInProgress: false,
        skipNonRestrictedTasks: false,
        timerIdsToSkip: [],
        backoff: [ExponentialBackoff],
        visibilityHandler: [Function (anonymous)] } },
  _path: ResourcePath { segments: [ 'activities' ], offset: 0, len: 1 } }

需明确该错误的含义、触发原因及解决方法。


错误分析与解决

错误含义

Code:5对应的NOT_FOUND是Firestore标准RPC错误码,表明请求的目标资源不存在。这里具体指Firestore无法定位你要写入的目标——可能是数据库实例、集合,或是因权限问题导致资源对当前请求上下文不可见(Firestore为安全起见,会用NOT_FOUND伪装权限不足的错误)。

触发原因

结合日志和代码,主要可能原因:

  • Firestore初始化逻辑错误:日志显示currentUser: User { uid: null },说明当前无认证用户。如果是Nuxt3服务端操作,未使用服务账号初始化Firebase Admin SDK,会导致权限验证失败,触发NOT_FOUND。
  • 权限规则限制:Firestore默认会自动创建不存在的集合,但如果安全规则禁止创建集合或写入操作,会返回NOT_FOUND而非权限不足的明确提示。
  • 项目/集合信息不匹配:代码中集合名activities拼写错误、大小写不符,或是初始化配置中的项目IDactivityapp-419511与Firebase控制台不一致。
  • Nuxt3环境实例混用:服务端和客户端Firebase实例未区分初始化,导致实例未正确连接到Firestore服务。

解决方法

  1. 修正Firebase初始化逻辑

    • 服务端必须使用Admin SDK,通过服务账号密钥初始化:
      import { initializeApp, cert } from 'firebase-admin/app';
      import { getFirestore } from 'firebase-admin/firestore';
      
      if (!getApps().length) {
        initializeApp({
          credential: cert('./service-account-key.json')
        });
      }
      
      const firestoreDb = getFirestore();
      
    • 客户端使用常规Firebase SDK,确保API密钥、项目ID等配置与控制台完全一致。
  2. 验证并调整安全规则

    • 测试阶段临时开放规则(仅用于排查):
      rules_version = '2';
      service cloud.firestore {
        match /databases/{database}/documents {
          match /{document=**} {
            allow read, write: if true;
          }
        }
      }
      
    • 若测试正常,说明原规则限制了写入,需调整为符合业务需求的规则,比如允许认证用户写入:
      allow write: if request.auth != null;
      
  3. 核对项目与集合信息

    • 检查集合名activities的拼写、大小写是否与后续创建的集合完全一致。
    • 确认Firebase控制台中的项目ID为activityapp-419511,初始化配置中的项目ID无拼写错误。
  4. 处理认证上下文

    • 若需用户认证后写入,确保客户端调用add方法前已完成用户登录;服务端通过服务账号获取足够权限。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 05:12:10