Разделение приложения Express на несколько файлов приводит к ошибке 500 Server - PullRequest
0 голосов
/ 15 июня 2019

Итак, для ясности, я хотел разделить свои функции на отдельные файлы на основе части моего 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 заставляет все работать.Однако это не может быть объявлено более одного раза, так что это не твердое решение.

1 Ответ

0 голосов
/ 15 июня 2019

Ваша база данных не импортируется должным образом в базу данных, кажется, что база данных становится неопределенной.

Попробуйте

db = require('./admin');

вместо

const {
    db,
} = require('./admin');

Кроме того, попробуйте экспортировать базу данных как

module.exports = database

вместо

module.exports = {
    database,
}
...