Skip to content

Commit bf7cc8f

Browse files
authored
Firestore: Fix "missing index" error message (#6712)
1 parent 3f1354f commit bf7cc8f

File tree

7 files changed

+95
-5
lines changed

7 files changed

+95
-5
lines changed

.changeset/little-rats-relax.md

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
'@firebase/firestore': patch
3+
'firebase': patch
4+
---
5+
6+
Fix "missing index" error message to include the link to create the composite index.

packages/firestore/src/platform/browser/webchannel_connection.ts

+5-2
Original file line numberDiff line numberDiff line change
@@ -97,8 +97,11 @@ export class WebChannelConnection extends RestConnection {
9797
xhr.getResponseText()
9898
);
9999
if (status > 0) {
100-
const responseError = (xhr.getResponseJson() as WebChannelError)
101-
.error;
100+
let response = xhr.getResponseJson();
101+
if (Array.isArray(response)) {
102+
response = response[0];
103+
}
104+
const responseError = (response as WebChannelError)?.error;
102105
if (
103106
!!responseError &&
104107
!!responseError.status &&

packages/firestore/src/platform/browser_lite/fetch_connection.ts

+6-1
Original file line numberDiff line numberDiff line change
@@ -69,9 +69,14 @@ export class FetchConnection extends RestConnection {
6969
}
7070

7171
if (!response.ok) {
72+
let errorResponse = await response.json();
73+
if (Array.isArray(errorResponse)) {
74+
errorResponse = errorResponse[0];
75+
}
76+
const errorMessage = errorResponse?.error?.message;
7277
throw new FirestoreError(
7378
mapCodeFromHttpStatus(response.status),
74-
'Request failed with error: ' + response.statusText
79+
`Request failed with error: ${errorMessage ?? response.statusText}`
7580
);
7681
}
7782

packages/firestore/src/util/async_observer.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ export class AsyncObserver<T> implements Observer<T> {
4545
if (this.observer.error) {
4646
this.scheduleEvent(this.observer.error, error);
4747
} else {
48-
logError('Uncaught Error in snapshot listener:', error);
48+
logError('Uncaught Error in snapshot listener:', error.toString());
4949
}
5050
}
5151

packages/firestore/test/integration/api/aggregation.test.ts

+21
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ import {
3636
withTestCollection,
3737
withTestDb
3838
} from '../util/helpers';
39+
import { USE_EMULATOR } from '../util/settings';
3940

4041
apiDescribe('Count quries', (persistence: boolean) => {
4142
it('can run count query getCountFromServer', () => {
@@ -118,4 +119,24 @@ apiDescribe('Count quries', (persistence: boolean) => {
118119
);
119120
});
120121
});
122+
123+
// Only verify the error message for missing indexes when running against
124+
// production, since the Firestore Emulator does not require index creation
125+
// and will, therefore, never fail in this situation.
126+
// eslint-disable-next-line no-restricted-properties
127+
(USE_EMULATOR ? it.skip : it)(
128+
'getCountFromServer error message is good if missing index',
129+
() => {
130+
return withEmptyTestCollection(persistence, async coll => {
131+
const query_ = query(
132+
coll,
133+
where('key1', '==', 42),
134+
where('key2', '<', 42)
135+
);
136+
await expect(getCountFromServer(query_)).to.be.eventually.rejectedWith(
137+
/index.*https:\/\/console\.firebase\.google\.com/
138+
);
139+
});
140+
}
141+
);
121142
});

packages/firestore/test/integration/api/query.test.ts

+34
Original file line numberDiff line numberDiff line change
@@ -54,9 +54,11 @@ import {
5454
apiDescribe,
5555
toChangesArray,
5656
toDataArray,
57+
withEmptyTestCollection,
5758
withTestCollection,
5859
withTestDb
5960
} from '../util/helpers';
61+
import { USE_EMULATOR } from '../util/settings';
6062

6163
apiDescribe('Queries', (persistence: boolean) => {
6264
addEqualityMatcher();
@@ -649,6 +651,38 @@ apiDescribe('Queries', (persistence: boolean) => {
649651
});
650652
});
651653

654+
// eslint-disable-next-line no-restricted-properties
655+
(USE_EMULATOR ? it.skip : it)(
656+
'can catch error message for missing index with error handler',
657+
() => {
658+
return withEmptyTestCollection(persistence, async coll => {
659+
const query_ = query(
660+
coll,
661+
where('sort', '<=', '2'),
662+
where('filter', '==', true)
663+
);
664+
const deferred = new Deferred<void>();
665+
666+
const unsubscribe = onSnapshot(
667+
query_,
668+
() => {
669+
deferred.reject();
670+
},
671+
err => {
672+
expect(err.code).to.equal('failed-precondition');
673+
expect(err.message).to.exist;
674+
expect(err.message).to.match(
675+
/index.*https:\/\/console\.firebase\.google\.com/
676+
);
677+
deferred.resolve();
678+
}
679+
);
680+
await deferred.promise;
681+
unsubscribe();
682+
});
683+
}
684+
);
685+
652686
it('can explicitly sort by document ID', () => {
653687
const testDocs = {
654688
a: { key: 'a' },

packages/firestore/test/lite/integration.test.ts

+22-1
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,8 @@ import { runTransaction } from '../../src/lite-api/transaction';
8383
import { writeBatch } from '../../src/lite-api/write_batch';
8484
import {
8585
DEFAULT_PROJECT_ID,
86-
DEFAULT_SETTINGS
86+
DEFAULT_SETTINGS,
87+
USE_EMULATOR
8788
} from '../integration/util/settings';
8889

8990
import {
@@ -2380,4 +2381,24 @@ describe('Count quries', () => {
23802381
expect(snapshot.data().count).to.equal(3);
23812382
});
23822383
});
2384+
2385+
// Only verify the error message for missing indexes when running against
2386+
// production, since the Firestore Emulator does not require index creation
2387+
// and will, therefore, never fail in this situation.
2388+
// eslint-disable-next-line no-restricted-properties
2389+
(USE_EMULATOR ? it.skip : it)(
2390+
'getCount error message is good if missing index',
2391+
() => {
2392+
return withTestCollection(async coll => {
2393+
const query_ = query(
2394+
coll,
2395+
where('key1', '==', 42),
2396+
where('key2', '<', 42)
2397+
);
2398+
await expect(getCount(query_)).to.be.eventually.rejectedWith(
2399+
/index.*https:\/\/console\.firebase\.google\.com/
2400+
);
2401+
});
2402+
}
2403+
);
23832404
});

0 commit comments

Comments
 (0)