CRA, встроенный в экспресс-приложение, нарушает экспресс-маршрутизацию - PullRequest
0 голосов
/ 22 марта 2019

Я создал приложение CRA, и у меня есть пара экспресс-маршрутов, загружающих файлы сборки CRA, например:

app.get('/files', async (req, res, next) => {
        ...
        try {
            res.format({
                html: function() {
                    const fileLoc = './public/react_ui/build/index.html';
                    const stream = fs.createReadStream(path.resolve(fileLoc));
                    stream.pipe(res);
                }
            });
        } catch (e) {
            next(e);
            res.redirect(SEE_OTHER.http_status, '/login');
        }
    });

До добавления CRA приложение Express открывало папку /public следующим образом.:

// access to express App code files
app.use(express.static(__dirname + '/public'));

Теперь, когда у меня есть встроенное приложение CRA, я хотел представить файлы сборки следующим образом, в противном случае файл index.html, созданный при построении CRA, не знает, где /static/js/*являются:

// access to React App build files
app.use(express.static(__dirname + '/public/react_ui/build'));

Однако, это нарушает экспресс-маршрутизацию.Например, когда я выхожу из приложения, оно должно отправить меня на конечную точку /, и это проверяет, вошел ли я в систему или нет, если нет, то оно должно отослать меня на страницу входа следующим образом:

app.get('/', function(req, res) {
...
    isLoggedIn(req, function(status) {
        switch (status.status) {
            case 200:
                res.redirect(303, '/loader');
                break;
            default:
                res.redirect(303, '/login');
        }
    });

});

Однако это то, что ломает.Если я удаляю команду для показа папки /build, описанной выше, тогда маршрутизация работает снова, и я отправляюсь на страницу входа в систему, но доступ к страницам CRA прерывается, потому что файлы сборки NOT FOUND.

// access to React App build files - if removed, routing works again
app.use(express.static(__dirname + '/public/react_ui/build'));

У кого-нибудь есть предложения относительно того, почему это происходит?Я не знаю, является ли это проблемой приложения реакции, экспресс-проблемой или чем-то еще.Любые идеи будут полезны.

1 Ответ

1 голос
/ 22 марта 2019

У вас есть конфликтующие маршруты.

app.js

app.use('/', express.static(__dirname + 'path/to/static/build'));

// Dont use '/' as it used for static route.
app.use('/auth', (req, res) => {
  ...
  isLoggedIn(req, function(status) {
        switch (status.status) {
            case 200:
                res.redirect(303, '/loader');
                break;
            default:
                res.redirect(303, '/login');
        }
    });
})

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

...