Перезагрузить узел экспресс-маршрутов сервера во время выполнения - PullRequest
0 голосов
/ 04 июля 2019

У меня есть требование, когда мне нужно рендерить динамические страницы для определенных маршрутов. Эти маршруты будут в первую очередь добавлены на работающий сервер, чтобы соответствующая страница маршрутов могла быть сгенерирована в приложении изоморфного реагирования и обслуживаться динамически.

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

Попробовал следующий код, и он работает, но только до запуска сервера.

var articlesEndpoints = ['/article2', '/article3'];
    articlesEndpoints.forEach(function (name) {
        console.log(name);
        app.get(name, function (req, res) {
            res.send(name);
        });
    });

Итак, прежде всего мне нужен механизм для сохранения динамических маршрутов (/article1,article2 ,.......,article N) в каком-то месте и запуска перезапуска сервера.

Перед перезапуском сервера он должен загрузить эти URL-адреса в массив и добавить динамические маршруты до перезапуска.

Хотя попытался использовать express-route-refresh модуль узла, но не смог заставить его работать.

Мне нужно указать, где следует обновить список динамических маршрутов (например, файл) или любым другим альтернативным способом, чтобы сервер каждый раз считывал обновленный файл перед перезапуском.

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

Любая помощь будет для меня большим подспорьем.

Ниже мой server.js

    /*globals process, console */
/*eslint no-console: ["error", { allow: ["log", "warn", "error"] }] */

if (process.env.NODE_ENV === "production" || process.env.NODE_ENV === "preprod") {
    require('newrelic');
}

import express from 'express';
import dotenv from 'dotenv';
import userAgent from 'express-useragent';
import compression from 'compression';
import cookieParser from 'cookie-parser';
import routes from './src/routes/';
import middleware from './src/utils/middleware';
import redirection from './src/utils/redirection';
import bodyParser from 'body-parser';
import path from 'path';
import cluster from 'cluster';
import os from 'os';
import { ASSET_BASE } from './src/config/common_conf';

if (cluster.isMaster) {
    let cpuCore; // Total no of CPU Cores.
    // Master cluster will setup the forks based on no of cores available.
    if (process.env.NODE_ENV === "development") {
        cpuCore = 1; // Total no of CPU Cores.
    } else {
        cpuCore = os.cpus().length; // Total no of CPU Cores.
    }
    console.log("Master cluster setting up " + cpuCore + " workers.");
    for (let i = 0; i < cpuCore; i += 1) {
        // Fork the process.
        cluster.fork();
    }

    cluster.on("online", (worker) => {
        console.log("Worker " + worker.process.pid + " is online");
    });

    // When process dies, replace it with a new fork.
    cluster.on("exit", (worker, code, signal) => {
        console.log("Worker " + worker.process.pid + " died with code: " + code + ", and signal: " + signal);
        console.log("Starting a new worker");
        cluster.fork();
    });
} else {
    // Config required for Env variables.
    dotenv.config();

    // Create the Express app.
    const app = express();

    app.use(function (req, res, next) {
        "use strict";
        res.header("Access-Control-Allow-Origin", "*");
        res.header("Access-Control-Allow-Headers", "content-type");
        next();
    });

    // Sync the redirection URLs
    redirection.syncCache();

    //To parse cookies
    app.use(cookieParser());

    // Middleware for parsing incoming request bodies
    app.use(bodyParser.urlencoded({ extended: true }));
    app.use(bodyParser.json());
    // Compression middleware which attempts to compress response bodies 
    app.use(compression());
    /* Do not disturb the order of  Middleware */
    // Middleware: To identify the browser information
    app.use(userAgent.express());
    // Middleware: Utility middleware
    app.use(middleware);
    // Middleware: Redirection middleware
    app.use(redirection.isRedirectable);
    // Make all the files in build_public folder availale to the outside world.
    app.use(`/${ASSET_BASE}`, express.static(path.resolve(__dirname, 'build_public')));
    app.use(`/${ASSET_BASE}`, express.static(path.resolve(__dirname, 'images')));
    /* var articlesEndpoints = ['/article2', '/article3'];
    articlesEndpoints.forEach(function (name) {
        console.log(name);
        app.get(name, function (req, res) {
            res.send(name);
        });
    }); */
    // Routes to be served
    routes(app);




    app.listen(process.env.PORT, () => {
        console.log('Started SEO server on ', new Date().toISOString());
        console.log('Env:', '\x1b[31m', process.env.NODE_ENV, '\x1b[0m');
        console.log('Port:', '\x1b[31m', process.env.PORT, '\x1b[0m');

    });


}

Текущий файл маршрутов выглядит так:

module.exports = function (app) {

    app.get('/', (req, res) => {
        res.status(200).json({message: "ok"});
    });

    app.get('/abc-directory/:pageId?', [commonMw], abcRenderer.renderRoutesABC); 
}
...