Почему Express Middleware не запускается, когда ему предшествует app.use (express.static (path.join (...))); - PullRequest
0 голосов
/ 20 октября 2018

Я пытаюсь устранить проблему в моем очень простом шаблоне экспресс-бэкенда.У меня есть универсальное промежуточное ПО, которое я хочу запускать при каждом запросе, который попадает на сервер (по сути, я просто пытаюсь установить cookie).

const express = require('express');
const path = require('path');
const uuidv4 = require('uuid/v4');
const cookieParser = require('cookie-parser')

const app = express();
app.use(cookieParser());

app.use(express.static(path.join(__dirname, 'client/build')));

app.use('/', (req, res, next) => {
    console.log(req.cookies)
    if (!req.cookies['audience_tracking_id']) {
        console.log('Processed Request - User Does Not Have Cookie.')
        const uniqueID = uuidv4();
        res.setHeader('Set-Cookie', [`audience_tracking_id=${uniqueID}`, `contentFocus=${randomProductName()}`]);
    }
    next();
});


app.get('*', (req, res) => {
    res.sendFile(path.join(__dirname + '/client/build/index.html'))
});

app.use(function(err, req, res, next) {
    console.log(err)
    res.status(err.status || 500).send();
});

const port = process.env.PORT || 6000;

app.listen(port);

console.log(`Audience Service Host listening on ${port}`);

Приложение включает в себя React Front-End, которыйразмещен на Heroku, и я передаю файлы статической сборки через Express в том же контейнере.

Вопрос в том, использую ли я Postman для локальной отправки запроса GET на этот файл в localhost: 6000, ИЛИЯ получаю доступ к контейнеру в Heroku, console.log() не запускается - и, возможно, к остальному промежуточному программному обеспечению.

Однако, если я переместу эту строку ниже промежуточного программного обеспечения cookie:

app.use(express.static(path.join(__dirname, 'client/build')));

ИЛИ, если я просто закомментирую это, мое промежуточное программное обеспечение сработает, и появится console.log ().Это было простое исправление, но я понятия не имею, почему это происходит на самом деле. Кто-нибудь знает, что я делаю не так с этим кодом, который заставляет промежуточное ПО работать как есть?

1 Ответ

0 голосов
/ 20 октября 2018

Это потому, что ваше промежуточное ПО "статический файл" будет пытаться сопоставить все запросы к вашему серверу:

app.use(express.static(path.join(__dirname, 'client/build')))

Ваш запрос "GET localhost: 6000 / *" будет перенаправляться на промежуточное ПО "статический файл"до промежуточного программного обеспечения "cookie".Если промежуточное ПО «статический файл» обнаружит, что файл существует, ответ будет завершен файлом.Если нет, действие промежуточного программного обеспечения относится к опции (падение), вы можете получить более подробную информацию о опции server-static

Я предлагаю установить корневой путь монтирования для статического файлаmiddlware :

app.use("/dist", express.static(path.join(__dirname, 'client/build')))

Если вы хотите проверять cookie во всех запросах, используйте этот формат:

app.use((req, res, next) => {
    // Do something
})
...