Как применить экземпляр use () ко всем маршрутам, кроме тех, которые переданы app.use (express.static ("dist"))? - PullRequest
0 голосов
/ 16 ноября 2018

Я думаю, что я решил эту проблему в процессе написания, в основном решение выглядит так:

Переместить обработчик статического файла над другим экземпляром use ()

Подтверждение того, что это приемлемый подход, будет оценено, хотя и, возможно, поможет другим в подобном сценарии.

Желаемое поведение

Применить экземпляр use() ко всем маршрутам, кроме тех, которые обрабатываются:

app.use(express.static("dist")); 

Фактическое поведение

use() применяется ко всем маршрутам, включая те, которые обрабатываются:

app.use(express.static("dist")); 

Сценарий

Для защиты доступа к API я использую модель, описанную в этом руководстве Lynda.com:

Node.js: защита API RESTful

В псевдокоде модель по существу состоит из:

  • глобальный use() экземпляр, который проверяет, был ли отправлен токен jwt
  • если токен был отправлен, если верифицирует токен
  • устанавливает свойство req.user на undefined, если проверка не удалась или токен не был отправлен
  • в противном случае он устанавливает свойство req.user для декодированного значения jwt, если проверка прошла успешно
  • последующее промежуточное ПО выполняет условное поведение на основе значения req.user

Эта модель хорошо работает для любых целей.

Однако недавно я добавил некоторые записи в консоли и вижу, что проверка выполняется для обоих:

Вопрос

Как я могу применить проверочный экземпляр use() ко всем маршрутам, кроме тех, которые обрабатываются app.use(express.static("dist")).

Что я пробовал

Мне кажется, я решил эту проблему, переместив раздел 2 кода ниже раздела 1.

// 01.  verification use() called on all requests

app.use((req, res, next) => {

    // if jwt authorisation has been sent in headers, verify it
    if (req.headers && req.headers.authorization && req.headers.authorization.split(' ')[0] === 'JWT') {

        console.log("jwt verification sent, verifying...");

        try {
            // this is synchronous as it has no callback
            req.user = jsonwebtoken.verify(req.headers.authorization.split(' ')[1], 'RESTFULAPIs');
            console.log("jwt verified, will return decoded value");
        } catch (err) {
            req.user = undefined;
            console.log("jwt verification failed, user will remain undefined: " + err);
        }

        // move to the next piece of middleware
        next();

    }
    // if jwt authorisation has not been sent in headers
    else {
        console.log("jwt verification not sent, leaving user as undefined");
        console.log(req.originalUrl);
        req.user = undefined;
        // move to the next piece of middleware
        next();
    }
});


// 02.  use() for serving static files
app.use(express.static("dist"));


// 03.  middleware to check if login has been verified
const api_login_required = (req, res, next) => {

    // if token verification was successful and the user property exists
    if (req.user) {
        // move to the next piece of middleware
        next();
    }
    // otherwise, return unauthorised user message
    else {
        res.json({ verification: 0 });
    }

}


// 04.  middleware called in route handlers
app.route("/api/:api_version/users/private_data")
    .get(api_login_required, api_users_private_data_get)
    .post(api_login_required, api_users_private_data_post);

1 Ответ

0 голосов
/ 16 ноября 2018

Промежуточное ПО всегда контролирует поток от кнопки к кнопке, в которой они написали.Как

if (example 1)code like 
app.use((req,res, next)=>{// middleware 1; next()} )
app.get('/rot1', (req, res)=> res.status(200).send('route 1'));
app.get('/rot2', (req, res)=> res.status(200).send('route 2'));

In this case, middleware appears in both route1, route because of middleware set at the top of the route.

If (example 2)code like
app.use((req,res, next)=>{// middleware 1; next()} )
app.get('/rot1', (req, res)=> res.status(200).send('route 1'));
app.use((req,res, next)=>{// middleware 2; next()} )
app.get('/rot2', (req, res)=> res.status(200).send('route 2')); 

Here middleware1 applied in both route1 and route 2
But middleware2 applied only on route2.

But you can also define specific middleware for each route
function middleware1(req, res, next){
    next();
}
function middleware2(req, res, next){
    next();
}
app.get('/rot1', middleware1, (req, res)=> res.status(200).send('route 1'));
app.get('/rot2', middleware2, (req, res)=> res.status(200).send('route 2')); 

Here middleware1 only applied on route1 and middleware2 only applied on route2.

Может быть, выше объяснение поможет вам !!

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