Итак, для ясности, я хотел разделить свои функции на отдельные файлы на основе части моего API, которую он обрабатывает.Я следовал учебному пособию онлайн, но теперь, когда я пытаюсь получить доступ к любому URL на API, это приводит к ошибке 500 сервера без видимого сообщения об ошибке.
Итак, мой index.ts
файл прост и обрабатывает всю экспресс-маршрутизацию.
const functions = require('firebase-functions');
import * as express from 'express';
import * as bodyParser from 'body-parser';
const app = express();
const main = express();
main.use('/v1', app);
main.use(bodyParser.json());
const {
getVendors,
getVendor
} = require('./vendors');
module.exports = {
'webApi' : functions.https.onRequest(main),
'get-vendors' : app.get('/vendors', getVendors),
'get-vendor' : app.get('/vendors/:id', getVendor)
}
За ним следует мой admin.ts
, который обрабатывает только один раз инициацию firebase администратора.
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();
const database = admin.firestore();
module.exports = {
database,
}
И, наконец, vendors.ts
, который, конечно, содержит все функции CRUD для vendors
.(Я включил только первые две функции для простоты)
const {
db,
} = require('./admin');
const getVendors = async (request:any, response:any) => {
try {
const vendorQuerySnapshot = await db.collection('vendors').get();
const vendors: any = [];
vendorQuerySnapshot.forEach((doc:any) => {
vendors.push({
id: doc.id,
data: doc.data()
});
});
response.json(vendors);
} catch(error) {
response.status(500).send(error);
}
}
const getVendor = async (request:any, response:any) => {
try {
const vendorId = request.params.id;
if(!vendorId) throw new Error('Vendor ID is required');
const vendor = await db.collection('vendors').doc(vendorId).get();
if(!vendor.exists) {
throw new Error('Vendor doesnt exist.');
}
response.json({
id: vendor.id,
data: vendor.data()
});
} catch(error) {
response.status(500).send(error);
}
}
Опять же, я получаю 500 Internal Server Error
всякий раз, когда пытаюсь получить доступ к http://my -url.com / v1 / ** где **
в этом случае будет равно vendors
или vendor/:id
ОБНОВЛЕНИЕ
Я чувствовал, что важно отметить, что до начала обученияи разбивая файлы, все работало как ожидалось.
ОБНОВЛЕНИЕ
Я добавил console.log(error)
к catch
из getVendor
, и это, похоже, проблемас db
.
TypeError: Cannot read property 'collection' of undefined
at getVendors (/srv/lib/vendors.js:6:46)
Удаление файла admin.ts
и помещение содержимого в файл vendors.ts
заставляет все работать.Однако это не может быть объявлено более одного раза, так что это не твердое решение.