Подтвердить что ты не робот

Правильный способ удаления промежуточного программного обеспечения из стека Express?

Есть ли канонический способ удаления промежуточного программного обеспечения, добавленного с помощью app.use из стека? Кажется, что должно быть возможно просто изменить массив app.stack непосредственно, но мне интересно, есть ли документированный метод, который я должен рассмотреть в первую очередь.

4b9b3361

Ответ 1

use на самом деле происходит из Connect (not Express), а все, что он действительно делает, - это нажать функцию промежуточного программного обеспечения на приложение stack..

Таким образом, вы должны просто отлично спланировать функцию из массива.

Однако имейте в виду, что нет документации по app.stack и не существует функции удаления промежуточного программного обеспечения. Вы рискуете, что будущая версия Connect сделает изменения несовместимыми с вашим кодом.

Ответ 2

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

const async = require('async')

// Middleware 
const m1 = (req, res, next) => {
    // do something here 
    next();
}

const m2 = (req, res, next) => {
    // do something here 
    next();
}

const m3 = (req, res, next) => {
    // do something here 
    next();
}

let dynamicMiddleware = [m1, m2, m3]

app.use((req, res, next) => {
    // execute async handlers one by one
    async.eachSeries(
        // array to iterate over
        dynamicMiddleware, 
        // iteration function
        (handler, callback) => {
            // call handler with req, res, and callback as next
            handler(req, res, callback)
        }, 
        // final callback
        (err) => {
            if( err ) {
            // handle error as needed

            } else {
                // call next middleware
                next()
            }
        }
    );
})

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

Ответ 3

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

Основываясь на некоторых из ответов, которые были до меня: В Express 4.x промежуточное программное обеспечение можно найти в app._router.stack. Обратите внимание, что промежуточное программное обеспечение вызывается по порядку.

// app is your express service

console.log(app._router.stack)
// [Layer, Layer, Layer, ...]

Совет. Вы можете искать в отдельных слоях слой, который хотите удалить/переместить

const middlewareIndex = app._router.stack.findIndex(layer => {
 // logic to id the specific middleware
});

Затем вы можете просто переместить/удалить их с помощью стандартных методов массива, таких как splice/unshift/etc

// Remove the matched middleware
app._router.stack.splice(middlewareIndex, 1);

Ответ 4

Вы можете использовать Express-dynamic-middleware, чтобы сделать это.

https://github.com/lanbomo/express-dynamic-middleware

Используйте это так

const express = require('express');

// import express-dynamic-middleware
const dynamicMiddleware = require('express-dynamic-middleware');


// create auth middleware
const auth = function(req, res, next) {
    if (req.get('Authorization') === 'Basic') {
        next();
    } else {
        res.status(401).end('Unauthorization');
    }
};

// create dynamic middleware
const dynamic = dynamicMiddleware.create(auth);

// create express app
const app = express();

// use the dynamic middleware
app.use(dynamic.handle());

// unuse auth middleware
dynamic.unuse(auth);

Ответ 5

Следуя приведенным выше советам, я добавил успех в следующей версии Express 4.x. Мой вариант использования записывал то, что входило, с помощью Slack Bolt, так что я мог зафиксировать, а затем высмеять его:

// Define a handy function for re-ordering arrays
Array.prototype.move = function(from, to) {
  this.splice(to, 0, this.splice(from, 1)[0]);
};

// Use the normal use mechanism, so that 'extra' stuff can be done
// For example, to log further up the order, use app.use(morgan("combined"))
app.use([my-middleware]); 

// Now adjust the position of what I just added forward
const numElements = app._router.stack.length;
app._router.stack.move(numElements - 1, 1);

Вы можете использовать   console.log("Stack after adjustment", app._router.stack) Подтвердить новый заказ - это то, что вы хотите. (Для Slack Bolt мне пришлось использовать app.receiver.app, потому что приложение Bolt оборачивает приложение Express).

Ответ 6

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

var middlewareA_isActivate = true;
//Your middleware code
function(req, res, next) {
   if (!middlewareA_isActivate) next();
   //.........
}
//Deactivate middleware
middlewareA_isActivate = false;

РЕДАКТИРОВАТЬ:
После прочтения кода ExpressJs (4.x) я замечаю, что вы можете получить доступ к стеклу middlewares через app._router.stack, манипуляции идут оттуда, я думаю. Тем не менее, я думаю, что этот "трюк", возможно, не сможет работать в будущем Express
P/s: не проверено, как работает Express при манипулировании стеком middlewares, хотя