Почему функция next () печатает свой аргумент в консоли? - PullRequest
2 голосов
/ 09 марта 2020

Я тир в узле и express, изучая вещи. Я читал документацию Express по этой ссылке: https://expressjs.com/en/guide/routing.html и в разделе Route Handlers этой страницы написано:

Вы можете предоставить несколько функций обратного вызова, которые ведут себя как промежуточное ПО для обработки запроса. Единственным исключением является то, что эти обратные вызовы могут вызывать next ('route') для обхода оставшихся обратных вызовов маршрута.

Примеры, приведенные на этой странице, не содержат никаких next() с аргументами в нем.

Я пытался реализовать его и передать какой-либо путь в качестве аргумента в этой функции, но он ведет себя странно и печатает этот аргумент в консоли, а также отправляет его в браузер.
Ниже приведен мой код:

const express = require('express');
const port = 8000;
const app = express();

app.get('/', (req, res, next) => {
    console.log("I am the first one");
    next('/demo');
}, function(req, res, next){
    console.log("I am the second one");
});

app.get('/demo', (req, res) => {
    console.log("Good!");
});

app.listen(port, (err) => {
    if(err){
        console.log("ERROS: ",err);
    }
    console.log("Express server is runnig on port: ",port);
});

В браузере я набрал http://localhost:8000/
Вывод в консоли:

I am the first one
/demo

вызов функции next('/demo') не приводит к запуску обработчика маршрута /demo. Где я ошибаюсь?
Правильно ли я понимаю?
На самом деле я не могу понять, как этот аргумент работает с функцией next ().

Поскольку на странице документации нет примера с аргументами в функции, кто-нибудь может объяснить, как эта функция next() работает с аргументами в примере?

Заранее благодарим за любую помощь, которую вы можете оказать

Ответы [ 2 ]

3 голосов
/ 09 марта 2020

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

В основном next(), который является функциональностью expressjs Speci c, используется для передачи управления следующему функциональному блоку. Он не ожидает параметры строки, кроме одного (приведенного ниже - после фрагмента ошибки). Это даже в том случае, когда вы правильно его инициализируете.

Вот вывод на вкладке сети после загрузки страницы, пожалуйста, проверьте.

<code><!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Error</title>
</head>
<body>
<pre>/demo

ПРИМЕЧАНИЕ: next ('route') будет работать только в функциях промежуточного программного обеспечения, которые были загружены с помощью app.METHOD () или router.METHOD () функционирует.

Вы не можете вызвать другой маршрутизатор так, как вы это делаете в данный момент, http будет иметь один ответ на один запрос на закрытие канала. Однако вы можете сделать что-то вроде.

app.get('/', (req, res, next) => {
    console.log("I am the first one");
    next();
}, function(req, res, next){
    console.log("I am the second one");
    next();
});
app.get('/', (req, res, next) => {
    console.log("I am the third one");
    next();
}, function(req, res, next){
    console.log("I am the fourth one");
});

Здесь промежуточное ПО работает как волшебный c и совпадает с любым идентичным параметром маршрута и продолжает выполнять все это.

1 голос
/ 09 марта 2020

Функция next () в

app.get('/', (req,...

используется для вызова следующего обратного вызова по тому же маршруту

...
function(req, res, next){
    console.log("I am the second one");
});

После удаления / демо из следующего ('/ demo '), вы заметите «Я второй» в консоли. ПРИМЕЧАНИЕ: next () передает управление только следующему промежуточному ПО по тому же маршруту.

app.get('/', (req, res, next)=>{ 
    // E.g. purpose of this middleware is to print request method
    console.log('Request method:', req.method)
    next() // this code passes the control to the next callback which is below
}, (req, res) => {
    console.log('End of route')
    res.send('OK')
}

Не задействует маршрут приложения. Чтобы go отправиться по другому маршруту, вам нужно отправить еще один HTTP-запрос. Надеюсь, это поможет!

ОБНОВЛЕНИЕ Вот сценарий, когда next ('route') что-то делает, этот работает только , если 2 маршрута имеют один и тот же URI и метод http .

const express = require('express')
const app = express();

function middleware1(req, res, next){
  console.log('Middleware #1')
  next('route') // ends current callback chain, moves to the next route
}

app.get('/', middleware1, (req, res, next)=>{
  console.log('Second middleware') // this callback is not executed
  res.send('OK')
})

app.get('/', (req, res)=>{
  console.log('Test') // the callback in this route gets called
  res.send('2nd get / OK')
})

app.listen(3000, () => {
  console.log('Server @', 3000)
})

Я думаю, что такая реализация маршрута редко применяется на практике, потому что лично я чувствую, что следовать ей скучно (имея 2 маршрута с одинаковыми методами uri и http). Тем не менее, хорошо узнать что-то от Гэндальфа Белого и этого.

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