Firestore检查用户是否存在的接口实现及408超时问题排查
Hey there, let's break down why you're hitting that 408 timeout and fix it up.
The Root Cause
Your route handler is marked as async, but when you call db.doc("Users/"+userID).get(), you're using a .then() callback without either:
- Awaiting the Promise (the cleaner approach for async functions), or
- Returning the Promise chain to Express so it knows to wait for the async operation to finish.
Right now, the function finishes executing immediately after calling .get(), but Express never gets a response sent because the .then() runs later in the event loop. After waiting too long without a response, the server sends a 408 timeout.
Fixed Code
Here's the revised version using await (which fits naturally with your async handler):
const admin = require('firebase-admin'); const functions = require('firebase-functions'); const express = require('express'); admin.initializeApp(); const db = admin.firestore(); const messaging = admin.messaging(); const app = express(); app.get('/checkUserID/:userID', async (request, response) => { const userID = request.params.userID; console.log(`Looking up user ${userID}`); try { // Await the Firestore get request instead of using .then() const documentSnapshot = await db.doc(`Users/${userID}`).get(); const userExists = documentSnapshot.exists; if (userExists) { response.set('Cache-Control', 'private, max-age=300'); // Send a proper JSON response for 200 status return response.status(200).json({ exists: true, message: `User ${userID} found` }); } else { return response.status(404).json({ errorCode: 404, errorMessage: `User '${userID}' not found` }); } } catch(error) { console.log('Error checking if user exists:', userID, error.message); // Use 500 for server errors, reserve 404 for missing user cases return response.status(500).json({ errorCode: 500, errorMessage: 'Failed to check user existence' }); } }); exports.api = functions.https.onRequest(app);
Key Changes Made
- Replaced
.then()withawaitto properly pause execution until Firestore returns the document snapshot, ensuring we only send a response once we have the data. - Added a proper JSON response for the 200 success case (your original code set status 200 but didn't send any content, which can confuse clients).
- Fixed the error code in the 404 response (you had
errorCode: 400which is for bad requests, but 404 is correct for "resource not found"). - Updated the catch block to return a 500 status code for server-side errors (like Firestore connectivity issues) instead of 404, keeping error semantics clear.
- Used template literals (
Users/${userID}) for cleaner, more readable string concatenation.
Why This Works
By using await, the async function waits for the Firestore get() Promise to resolve before moving on. This ensures Express doesn't time out waiting for us to send a response—we only send it once we've confirmed the user's existence (or hit an error).
内容的提问来源于stack exchange,提问作者George Nick Gorzynski

