2016-08-28 6 views
2

Я использую экспресс-маршрутизатор для создания маршрутов в своем приложении, и я пытаюсь применить индивидуальное промежуточное ПО к каждому маршруту, поэтому промежуточное программное обеспечение будет вызываться только тогда, когда URL-адреса будут удалены для этого конкретного маршрутизатора. Вот мой код:Быстрое промежуточное программное обеспечение, не называемое

const express = require('express'); 
const router = express.Router(); 
const authentication = require('./helpers/authentication'); 

const registerController = (app, path, router, middleware) => { 
    middleware.forEach((routerMiddleware) => { 
    router.use(routerMiddleware); 
    }); 
    app.use(path, router); 
}; 

const testMiddleware = (request, response, next) => { 
    console.log(request.originalUrl); 
    next(); 
}; 

module.exports = { 
    init: (app) => { 
    registerController(app, '/auth', require('./authenticationController'), [testMiddleware]); 
    registerController(app, '/customer', require('./customerController'), [authentication, testMiddleware]); 
    registerController(app, '/filter', require('./filterController'), [authentication, testMiddleware]); 
    registerController(app, '/', require('./homeController'), [testMiddleware]); 
    registerController(app, '/inventory', require('./inventoryController'), [authentication, testMiddleware]); 
    registerController(app, '/settings', require('./settingsController'), [authentication, testMiddleware]); 
    } 
}; 

Я построил метод registerController, так что я могу назначить промежуточное программное обеспечение в различных конфигурациях для различных маршрутизаторов. Каждый требует заявления, которое втягивает в имени файла xxxController возвращается маршрутизатор, как это:

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

router.get('/', (request, response) => { 
    const file = fs.readFileSync(__dirname + '/../index.html', "utf8"); 
    response.send(file); 
}); 

module.exports = router; 

я добавил тест промежуточного уровня, чтобы увидеть, если простейший промежуточный слой будет работать, но это не называется. Что я здесь делаю неправильно?

+0

На самом деле разные вызовы не используют один и тот же экземпляр маршрутизатора. Вероятно, вы так думаете, потому что есть ссылка на экспресс-маршрутизатор в верхней части файла. Это была ошибка с моей стороны, поскольку теперь это неиспользуемая переменная. Каждый вызов registerController принимает маршрутизатор, поскольку он является третьим параметром, и в каждом вызове я передаю возвращаемое значение оператора require. Все они требуют, чтобы инструкции возвращали другой экземпляр экспресс-маршрутизатора. – jdavis

ответ

1

Причина, по которой вы не видите используемый routerMiddleware, состоит в том, что в файле контроллера вы указали router.get(), который уже отвечает на запрос. Теперь, если у вас был запрос POST, , то будет вызываться ваш routerMiddleware, потому что в файле вашего контроллера нет router.post().

Экспресс оценивает маршруты в том порядке, в котором они были добавлены в маршрутизатор/приложение.

1

Когда вы строите Express-маршрутизатор, порядок, в котором вы устанавливаете маршруты и добавляете промежуточное ПО, очень важен. Например, если вы добавите маршрут, добавьте промежуточное ПО, добавьте больше маршрутов, только маршруты, которые были добавлены после добавления промежуточного программного обеспечения, вызовут промежуточное программное обеспечение. Первый маршрут, который был настроен до установки промежуточного программного обеспечения, не будет вызывать промежуточное программное обеспечение для вызова.

Так что проблема с моим кодом выше в том, что я строил все маршруты, а затем добавлял в промежуточное программное обеспечение, предполагая, что все промежуточное ПО, добавленное к маршрутизатору, будет вызываться для всех маршрутов.

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

Смежные вопросы