code: 13,
details: 'Received RST_STREAM with code 2 triggered by internal client error: Protocol error',
metadata: Metadata { internalRepr: Map(0) {}, options: {} },
note: 'Exception occurred in retry method that was not classified as transient'
Эта ошибка возникает у меня с эмулятором при каждой попытке, поэтому ее легко воспроизвести.
В конечной точке сервера Node.js/sveltekit. Вот мои версии lib:
pnpm view firebase-admin dependencies
{
'@fastify/busboy': '^1.1.0',
'@firebase/database-compat': '^0.3.0',
'@firebase/database-types': '^0.10.0',
'@types/node': '>=12.12.47',
jsonwebtoken: '^9.0.0',
'jwks-rsa': '^3.0.1',
'node-forge': '^1.3.1',
uuid: '^9.0.0',
'@google-cloud/firestore': '^6.4.0',
'@google-cloud/storage': '^6.5.2'
}
Мой вариант использования довольно прост: firebaseInit.js:
import admin from 'firebase-admin'
const useEmulator = true;
if (useEmulator){
process.env['FIRESTORE_EMULATOR_HOST'] = 'localhost:4000';
}
// TODO: Add SDKs for Firebase products that you want to use
// https://firebase.google.com/docs/web/setup#available-libraries
// Your web app's Firebase configuration
// For Firebase JS SDK v7.20.0 and later, measurementId is optional
const firebaseConfig = {
apiKey: "XXXXX",
authDomain: "linkedincv-bdbec.firebaseapp.com",
projectId: "linkedincv-bdbec",
storageBucket: "linkedincv-bdbec.appspot.com",
messagingSenderId: "XXXXX",
appId: "XXXXX",
measurementId: "XXXXX",
};
// Initialize Firebase
const app = admin.initializeApp(firebaseConfig);
// const db = getFirestore(app);
const db = admin.firestore();
export {app, db}
Мой код с использованием инициализированной переменной db:
+сервер.js
import { json } from '@sveltejs/kit';
import {db} from '../../../lib/middleware/firebaseInit'
export async function POST({request}) {
try {
const payload = await request.json();
const uniqueUrl = payload.uniqueUrl;
const docRef = await db.collection("json_cv").doc("zied").set( payload)
// Return the document ID of the stored object
return json({
body: JSON.stringify({ documentId: docRef.id }),
headers: { 'Content-Type': 'application/json' },
status: 200
});
} catch (error) {
// Handle any errors that occur during processing
console.error(error);
return json({
body: JSON.stringify({ error }),
headers: { 'Content-Type': 'application/json' },
status: 500
});
}
}
Просто для полноты, если вы хотите воспроизвести, вот файл, специфичный для sveltekit, позволяющий CORS хуки.server.js
import { Handle } from '@sveltejs/kit';
export const handle = async ({ resolve, event }) => {
const response = await resolve(event);
// Apply CORS header for API routes
if (event.url.pathname.startsWith('/cv/submit')) {
// Required for CORS to work
if (event.request.method === 'OPTIONS') {
return new Response(null, {
headers: {
'Access-Control-Allow-Methods': 'POST, GET, OPTIONS, DELETE',
'Access-Control-Allow-Origin': '*',
}
});
}
response.headers.append('Access-Control-Allow-Origin', `*`);
}
return response;
};
Примечание. Я видел ошибку , говорящую об этой проблеме , но, похоже, она не является для них систематической.
После запуска firebase init во второй раз все решилось. Возможно, поскольку я новичок в firebase, я не запустил инициализацию с правильными параметрами в первый раз. Но по мере того, как я открывал для себя новые вещи, я не мог вспомнить, что я сделал не так.
Возможно, связано с настройкой эмулятора Firebase или совместимостью между версией Firebase SDK и другими зависимостями. Вы можете сообщить об ошибке по этой ссылке, чтобы команда продукта проверила это, однако для этого нет ETA.