Узел, Express - индексный файл некорректно вызывает файлы - PullRequest
0 голосов
/ 19 января 2020

Привет, в моем проекте express у меня есть индексный файл, в котором мне требуются разные файлы для запуска приложения. Для этого требуется файл подключения к базе данных, файл для ведения журнала с использованием winston и файл для настройки маршрутов.

Я использую оператор require() в express для вызова этих файлов и при запуске приложения ( используя nodemon), я ожидаю, что некоторые сообщения будут зарегистрированы в терминале, проверяя, что файлы были вызваны, однако сообщения не появляются.

Вот мой код: index. js:

const express = require('express')
const app = express()

require('./startup/logging') ()
require('./startup/db') ()
require('./startup/routes') (app)

const port = process.env.PORT || 3000
app.listen(port, () => winston.info(`Listening on port: ${port}`))

дБ. js:

const mongoose = require('mongoose')
const winston = require('winston')

module.exports = function() {

    mongoose.connect('mongodb://localhost/dwg', {useNewUrlParser: true, useUnifiedTopology: true})
        .then(() => winston.info('Connected to MongoDB...'))
        .catch(err => console.error("Error"))
}

регистрация. js:

const winston = require('winston');

    module.exports = function() {
      winston.handleExceptions(
        new winston.transports.File({ filename: 'uncaughtExceptions.log' }));

      process.on('unhandledRejection', (ex) => {
        throw ex;
      });

      winston.add(winston.transports.File, { filename: 'logfile.log' });
    }

маршруты. js:

const express = require('express');

module.exports = function(app) {
    app.use(express.json())
}

При запуске приложения база данных не создается. Я могу подтвердить это, посмотрев на компас mongodb. Сообщение, которое должно быть напечатано app.listen(), также не выводится на консоль. Кто-нибудь знает проблему? Спасибо.

1 Ответ

1 голос
/ 19 января 2020

Проблема, возникающая при таком способе, заключается в том, что ваше приложение запускается до того, как оно получает возможность выполнить оставшуюся часть работы, например, создание соединения с БД и т. Д. c. Вы должны запускать приложение только после выполнения этих задач. как то так

const express = require('express')
const app = express()

const logging = require('./startup/logging');
const db = require('./startup/db');
const routes = require('./startup/routes');

const port = process.env.PORT || 3000
app.listen(port, async () => {
  await logging();
  await db();
  await routes();
  // assuming you have winston here.
  winston.info(`Listening on port: ${port}`)
})

Mongo part is defintely async so need await. Check if routes and logging needs await or not.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...