Я новичок в Nodejs и работаю над Express js. Сейчас я работаю над «функцией промежуточного программного обеспечения» для определенных маршрутов, я хочу знать, что «что такое использование следующего», означает после аутентификации, что может делать «следующая» функция? если мы хотим переместить/перенаправить на другую функцию, то как мы можем это сделать? А что такое "checkAuthentication"? Вот мой текущий код

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

// Custom middleware function
const authMiddleware = (req, res, next) => {
  // Check if user is authenticated
  const isAuthenticated = checkAuthentication(req);
  
  if (isAuthenticated) {
    next();
  } else {
    // User is not authenticated, send an unauthorized response
    res.status(401).send('Unauthorized');
  }
};

// Middleware function is applied to specific routes
app.get('/protected', authMiddleware, (req, res) => {
  res.send('Protected Route');
});

// Route handler
app.get('/', (req, res) => {
  res.send('Home Page');
});

// Start the server
app.listen(3000, () => {
  console.log('Server is listening on port 3000');
});


0
Jennie 24 Май 2023 в 20:50
Никто не может ответить, что такое checkAuthentication; у нас нет информации о вашей кодовой базе, кроме опубликованного фрагмента. next продолжает обработку запроса. Использование промежуточного ПО может быть хорошим исходным ресурсом.
 – 
Dave Newton
24 Май 2023 в 21:03

4 ответа

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

  1. Вы можете отправить ответ на запрос и завершить маршрутизацию для этого запроса. Вы отправляете ответ и НЕ звоните next(). В вашем примере это происходит в ветке else вашего if (isAuthentcated), которая выполняет res.status(401).send('Unauthorized');. Он отправляет ответ без вызова next().

  2. Вы можете отправить Express его обработчику ошибок, вызвав next(err), где вы передаете next объект ошибки. Это прекратит дальнейшую маршрутизацию, и поток управления переместится к любому обработчику ошибок, установленному для Express.

  3. Вы можете указать Express, что хотите продолжить маршрутизацию к другим обработчикам маршрутов, которые также могут соответствовать этому запросу. Вы делаете это, вызывая next(), не передавая никаких аргументов next. В вашем примере кода это происходит в ветке if (isAuthentcated), где он вызывает next().

Резюме. Таким образом, вызов next() без аргументов продолжит маршрутизацию к другим обработчикам запросов, которые соответствуют текущему маршруту. Вызов next(err) передает управление обработчику ошибок Express.

Для других ваших вопросов:

если мы хотим переместить/перенаправить на другую функцию, то как мы можем это сделать?

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

Если вы хотите перенаправить клиента на новый URL-адрес, вы можете отправить ответ с res.redirect(someURL) и не вызывать next().

А что такое "checkAuthentication"?

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

0
jfriend00 24 Май 2023 в 21:07

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

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

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

function checkAuthentication(req) {
  /*
  I am considering this as my authentication function. 
  When the user logged in, server has sent him a token, which now will act as a validator. 
  */

  if (req.headers.token) {
    const user = someFunctionToFetchUser(req.header.token)
    return user
  } else {
    return false
  }
}

/*
Now I want a function to be there on each protected api routes
to make user if user has a valid token then only allow them to interact with the data base otherwise throw an error 
*/


const authMiddleware = (req, res, next) => {
  // Check if user is authenticated
  const isAuthenticated = checkAuthentication(req);

  if (isAuthenticated) {
    // Now you have verified the has valid a token. So allow user 
    // to reach to the controller or any other middleware, if any.
    next();
  } else {
    // User is not authenticated, send an unauthorized response
    res.status(401).send('Unauthorized');
  }
};

// Middleware function is applied to specific routes
app.get('/protected', authMiddleware, (req, res) => {
  res.send('Protected Route');
});

// You can have any number of middlewares
app.get('/protected', authMiddleware, someOtherMiddleware, (req, res) => {
  res.send('Protected Route');
});

// And also you can pass data from middleware to next middleware/controller also by attahching it with request

function newMiddleware(req, res, next) {
  req.foo = "bar" //Now you can access this foo variable in next function.
}
1
Joy Gupta 24 Май 2023 в 21:09

В Express.js следующая функция — это функция обратного вызова, предоставляемая Express для перехода к следующей функции промежуточного программного обеспечения в стеке. Он используется для передачи управления от текущей функции промежуточного программного обеспечения следующему промежуточному программному обеспечению или обработчику маршрута.

В предоставленном вами коде функция authMiddleware действует как промежуточная функция, которая проверяет, аутентифицирован ли пользователь. Если пользователь аутентифицирован, вызывается следующая функция, которая позволяет запросу перейти к следующему промежуточному программному обеспечению или обработчику маршрута в стеке. Если пользователь не аутентифицирован, отправляется неавторизованный ответ, и запрос не обрабатывается дальше.

Вот как вы можете перенаправить на другую функцию или обработчик маршрута после аутентификации:

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

// Custom middleware function
const authMiddleware = (req, res, next) => {
  // Check if user is authenticated
  const isAuthenticated = checkAuthentication(req);

  if (isAuthenticated) {
    next();
  } else {
    // User is not authenticated, send an unauthorized response
    res.status(401).send('Unauthorized');
  }
};

// Middleware function is applied to specific routes
app.get('/protected', authMiddleware, (req, res, next) => {
  // User is authenticated, continue to the next route handler
  next();
}, (req, res) => {
  // This is the new route handler after authentication
  res.send('Protected Route');
});

// Route handler
app.get('/', (req, res) => {
  res.send('Home Page');
});

// Start the server
app.listen(3000, () => {
  console.log('Server started on port 3000');
});
0
Dhananjaya Dutt Mishra 24 Май 2023 в 21:11

Надеюсь, это поможет вам лучше понять это.

const express = require('express');
const app = express();
const port = 3000;
const path = require('path');

function firstMiddleware(req, res, next) {
  console.log('You are in first middleware');
  req.firstMiddleware = true;
  next(); // I am deliberately asking to pass the control to the next immediate function
}

function secondMiddleware(req, res, next) {
  console.log('You are in second middleware');
  req.secondMiddleware = true;
  next(); // same here, sending control to next immediate function
}


app.get('/', firstMiddleware, secondMiddleware, function(req, res) {
  console.log('Now I am in a controller');
  console.log(
    `Checking if the control was in firstMiddleware ${req.firstMiddleware}`
  );
  console.log(
    `Checking if the control was in secondMiddleware ${req.secondMiddleware}`
  );
  //here i do not have next paramater, this is what makes it different from a middleware. 
  //So if next is not there then you need to send the control back to frontend when everything is done
  res.status(200).send('API worked');
});
app.listen(port, () => {
  // Code.....
})
0
Joy Gupta 25 Май 2023 в 20:43