Промежуточное программное обеспечение сервера Express выполняется дважды? - PullRequest
0 голосов
/ 25 октября 2019

После попытки записать некоторые данные в индексный файл. Я обнаружил, что мой экспресс-сервер выполняется дважды. Почему я получаю эту ошибку / ошибку?

Запущенный узел 12.13.0 LTS, Express 4.17.1 и последние версии пакетов на дату этого поста. Я пытался комментировать некоторые части кода и всегда выполнялся дважды.

Мой код app.js:

const express = require('express');
const expressLayouts = require('express-ejs-layouts');
const path = require('path');
const bodyParser = require('body-parser');
const favicon = require('serve-favicon');
const app = express();

// ENV Variables
require('dotenv').config();
const PORT = process.env.PORT;

// Authentication Packages
const session = require('express-session');
const passport = require('passport');

// Middlewares
app.use(favicon(path.join(__dirname,'public','images','favicon.ico')));

app.use(bodyParser.urlencoded({extended: false}));
app.use(express.json());

app.use(session({
  secret: 'GBR6N7^?5Xx-Ldqxf&*-Hv$',
  resave: false,
  saveUninitialized: false,
  //cookie: { secure: true }
}));
app.use(passport.initialize());
app.use(passport.session());

// View Engine
app.use(expressLayouts);
app.use(express.static(path.join(__dirname, 'public')));
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');

// Routes
app.use('/', require('./routes/index'));

// Controllers
app.use('/profile', require('./routes/profile'));
app.use('/products', require('./routes/products'));
app.use('/bookmarks', require('./routes/bookmarks'));

// Catch 404
app.use((req, res) => {
    res.render('pages/404');
});

app.listen(PORT, () => console.log(`Server started on port ${PORT}`));

и мой код index.js:

const express = require('express');
const router = express.Router();

// Official pages
router.get('/', (req, res) => {

    // THIS IS THE CODE I GET TWICE ON CONSOLE
    console.log(req.user);
    console.log(req.isAuthenticated());
    // THIS IS THE CODE I GET TWICE ON CONSOLE

    res.render('pages/index');
});

router.get('/about', (req, res) => {
    res.render('pages/about');
});

router.get('/features', (req, res) => {
    res.render('pages/features');
});

// Footer pages
router.get('/terms', (req, res) => {
    res.render('pages/terms');
});

router.get('/refunds', (req, res) => {
    res.render('pages/refunds');
});

module.exports = router;

Также у меня есть эти две функции в моем profile.js (для passport.js):

passport.serializeUser((userId, done) => {
    done(null, userId);
});

passport.deserializeUser((userId, done) => {
    done(null, userId);
});

Я получаю эти результаты дважды:

console.log(req.user);
console.log(req.isAuthenticated());

Вывод (Выполнено дважды!):

undefined
false
undefined
false

, и я ожидаю одно:

undefined
false

1 Ответ

0 голосов
/ 25 октября 2019

В связи с тем, как работает экспресс-маршрутизация, путь / будет соответствовать /, /about, /favicon.ico и т. Д. Это связано с тем, что Express поддерживает не только маршрутизацию на конечной точке, но и монтаж пути. Другими словами, Express поддерживает такие вещи, как:

const app = express();
const route = express.Router();

route.get('/world', (req, res) => { res.send('hello') });

app.get('/hello', route); // mounts world to hello 
                          // so we can access /hello/world

Для поддержки описанной выше функции Express необходимо интерпретировать пути, такие как /hello, что означает /hello и /hello/anything/else. Он должен рассматривать его как конечную точку и, возможно, просто как путь, ведущий к конечной точке.

Это означает, что если у вас есть путь:

app.get('/', () => {});

Он также будет срабатывать, если браузерзапросы /favicon.ico. И браузеры просят favicon.ico нарисовать крошечный значок на вкладке браузера. Вот почему ваш маршрут запускается дважды .

Несколько вещей, о которых следует помнить при написании маршрутов / контроллеров Express:

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

  2. Если вы используете express.static(), убедитесь, что он настроен до / дорожка. Да, первое правило, приведенное выше, также должно охватывать это, но я вижу эту проблему достаточно часто, чтобы она заслужила свою точку зрения.

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

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