#node.js #express
Вопрос:
Я пытаюсь добавить простую функцию промежуточного программного обеспечения для каждого запроса на уровне маршрутизатора.
В документах говорится:
функция промежуточного программного обеспечения без пути подключения будет выполняться для каждого запроса к маршрутизатору
В моем приложении у меня есть только один маршрутизатор с одной конечной точкой, которая прослушивает каждый запрос, и я размещаю свою функцию промежуточного программного обеспечения над этой конечной точкой, но промежуточное программное обеспечение никогда не запускается.
Экспресс-настройка:
const initializeExpress = (): void => {
const port = process.env.PORT;
const app = express();
app.use(helmet());
app.use(express.json());
app.use(cors());
app.use('/api', Router);
app.listen(port, () => {
console.log(`Listening for requests at http://localhost:${port}`);
});
};
Мой код маршрутизатора:
const Router = express.Router();
Router.use((req, res, next) => {
const token = req.header('authorization');
if (!token) res.status(401).send({ message: 'Unauthorized' });
const isAuthenticated = isAuthorized(token!);
if (isAuthenticated) {
next();
} else {
res.status(401).send({ message: 'Unauthorized' });
}
});
Router.get(
'/:arg1/:arg1Id?/:arg2?/:arg2Id?/:arg3?/:arg3Id?/:arg4?/:arg4Id?',
async (req, res): Promise<void> => {
const routeParams = filterRouteParams(req.params);
const path = basePath getPathFromRouteParams(routeParams) '/data.json';
if (await pathExists(path)) {
const data = await getJsonFromPath(path);
if (!isEmpty(data)) {
res.status(200).json(data);
return;
}
res.status(400).send({ message: 'Data not found' });
}
}
);
Что я здесь делаю не так?
Комментарии:
1. Показывает ли это какую-либо ошибку? Или это не входит в функцию промежуточного программного обеспечения?
2. Мой маршрут GET запускается без вызова промежуточного программного обеспечения, без ошибок
Ответ №1:
На каком маршруте будет активировано промежуточное программное обеспечение, вам необходимо определить его.
Есть два способа сделать это
Во-первых, вызовите промежуточное программное обеспечение перед вашим маршрутом:
const Router = express.Router();
const myMiddleware = (req, res, next) => {
const token = req.header('authorization');
if (!token) res.status(401).send({ message: 'Unauthorized' });
const isAuthenticated = isAuthorized(token!);
if (isAuthenticated) {
next();
} else {
res.status(401).send({ message: 'Unauthorized' });
}
}
Router.get(
'/:arg1/:arg1Id?/:arg2?/:arg2Id?/:arg3?/:arg3Id?/:arg4?/:arg4Id?',
myMiddleware(), //Call middleware here
async (req, res): Promise<void> => {
const routeParams = filterRouteParams(req.params);
const path = basePath getPathFromRouteParams(routeParams) '/data.json';
if (await pathExists(path)) {
const data = await getJsonFromPath(path);
if (!isEmpty(data)) {
res.status(200).json(data);
return;
}
res.status(400).send({ message: 'Data not found' });
}
}
);
Во-вторых, вызов промежуточного программного обеспечения для всех определенных вами маршрутов:
const Router = express.Router();
const myMiddleware = (req, res, next) => {
const token = req.header('authorization');
if (!token) res.status(401).send({ message: 'Unauthorized' });
const isAuthenticated = isAuthorized(token!);
if (isAuthenticated) {
next();
} else {
res.status(401).send({ message: 'Unauthorized' });
}
}
Router.use('/:arg1/:arg1Id?/:arg2?/:arg2Id?/:arg3?/:arg3Id?/:arg4?/:arg4Id?', myMiddleware());
Router.get(
'/:arg1/:arg1Id?/:arg2?/:arg2Id?/:arg3?/:arg3Id?/:arg4?/:arg4Id?'
async (req, res): Promise<void> => {
const routeParams = filterRouteParams(req.params);
const path = basePath getPathFromRouteParams(routeParams) '/data.json';
if (await pathExists(path)) {
const data = await getJsonFromPath(path);
if (!isEmpty(data)) {
res.status(200).json(data);
return;
}
res.status(400).send({ message: 'Data not found' });
}
}
);
Комментарии:
1. Это действительно решение моей проблемы, но разве я не могу назначить промежуточное программное обеспечение для всех моих маршрутов в этом маршрутизаторе одним назначением?
2. Второй способ, который я предложил сделать именно так. Адрес, который вы используете,
Router.use
и все его производные попадут в промежуточное программное обеспечение.