Я новичок в 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');
});
4 ответа
Когда вы пишете обработчик промежуточного программного обеспечения, у вас есть несколько вариантов в конце того, что вы делаете.
Вы можете отправить ответ на запрос и завершить маршрутизацию для этого запроса. Вы отправляете ответ и НЕ звоните
next()
. В вашем примере это происходит в ветке else вашегоif (isAuthentcated)
, которая выполняетres.status(401).send('Unauthorized');
. Он отправляет ответ без вызоваnext()
.Вы можете отправить Express его обработчику ошибок, вызвав
next(err)
, где вы передаетеnext
объект ошибки. Это прекратит дальнейшую маршрутизацию, и поток управления переместится к любому обработчику ошибок, установленному для Express.Вы можете указать Express, что хотите продолжить маршрутизацию к другим обработчикам маршрутов, которые также могут соответствовать этому запросу. Вы делаете это, вызывая
next()
, не передавая никаких аргументовnext
. В вашем примере кода это происходит в веткеif (isAuthentcated)
, где он вызываетnext()
.
Резюме. Таким образом, вызов next()
без аргументов продолжит маршрутизацию к другим обработчикам запросов, которые соответствуют текущему маршруту. Вызов next(err)
передает управление обработчику ошибок Express.
Для других ваших вопросов:
если мы хотим переместить/перенаправить на другую функцию, то как мы можем это сделать?
Непонятно, что именно вы имеете в виду здесь. next()
просто продолжает маршрутизацию. Он не вызывает конкретную функцию. Если вы хотите вызвать определенную функцию, вы можете просто сделать это с помощью вызова функции в промежуточном программном обеспечении.
Если вы хотите перенаправить клиента на новый URL-адрес, вы можете отправить ответ с res.redirect(someURL)
и не вызывать next()
.
А что такое "checkAuthentication"?
Поскольку вы не раскрываете код для этого, мы точно не знаем, что он делает. Я предполагаю, что он проверяет что-то в файле cookie или заголовке, чтобы убедиться, что клиент уже прошел аутентификацию или учетные данные были включены в этот запрос.
Далее идет функция обратного вызова, которая передается функции промежуточного программного обеспечения. Вы можете найти разные его названия в разных фреймворках, но концепция остается неизменной.
Я попытаюсь объяснить промежуточное программное обеспечение через ваш код.
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.
}
В 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');
});
Надеюсь, это поможет вам лучше понять это.
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.....
})
Новые вопросы
javascript
По вопросам программирования на ECMAScript (JavaScript/JS) и его различных диалектах/реализациях (кроме ActionScript). Имейте в виду, что JavaScript — это НЕ то же самое, что Java! Включите все ярлыки, относящиеся к вашему вопросу; например, [node.js], [jQuery], [JSON], [ReactJS], [angular], [ember.js], [vue.js], [typescript], [svelte] и т. д.
checkAuthentication
; у нас нет информации о вашей кодовой базе, кроме опубликованного фрагмента.next
продолжает обработку запроса. Использование промежуточного ПО может быть хорошим исходным ресурсом.