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服务。
解决方法
修正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等配置与控制台完全一致。
- 服务端必须使用Admin SDK,通过服务账号密钥初始化:
验证并调整安全规则
- 测试阶段临时开放规则(仅用于排查):
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /{document=**} { allow read, write: if true; } } } - 若测试正常,说明原规则限制了写入,需调整为符合业务需求的规则,比如允许认证用户写入:
allow write: if request.auth != null;
- 测试阶段临时开放规则(仅用于排查):
核对项目与集合信息
- 检查集合名
activities的拼写、大小写是否与后续创建的集合完全一致。 - 确认Firebase控制台中的项目ID为
activityapp-419511,初始化配置中的项目ID无拼写错误。
- 检查集合名
处理认证上下文
- 若需用户认证后写入,确保客户端调用
add方法前已完成用户登录;服务端通过服务账号获取足够权限。
- 若需用户认证后写入,确保客户端调用
内容的提问来源于stack exchange,提问作者Julius
相关产品推荐
相关产品推荐

