#express
#экспресс
Вопрос:
Я довольно новичок в typescript/express, и у меня проблема с импортом промежуточного ПО.
Действительно, у меня есть модуль auth.ts
, который в ближайшем будущем будет содержать несколько промежуточных программ. Вот его текущая реализация (только с одним промежуточным ПО для упрощения).
import { Request, Response } from "express"; import jwt, { JwtPayload } from "jsonwebtoken"; export function getConnectedPerson(req: Request, res: Response, next) { try { const token = req.headers.authorization.split(' ')[1]; const { personId } = jwt.verify(token, process.env.TOKEN_SEED) as JwtPayload; res.locals.personId = personId; next(); } catch { res.status(401).send("Invalid request"); } }
и вот моя реализация контроллера:
import { Request, Response, Router } from "express"; import { autoInjectable } from "tsyringe"; const authMiddleware = require("auth") @autoInjectable() export class ActivityController { constructor() { } initRoutes(router: Router) { router.get('/activities', [ authMiddleware.getConnectedPerson ],async (req: Request, res: Response) =gt; {}); } }
при запуске моего приложения я получаю следующую ошибку:
Error: Route.get() requires a callback function but got a [object Object]
Я немного растерян со всеми возможными вариантами импорта/экспорта/требований. Знаете ли вы, что не так с моей реализацией ?
Ответ №1:
В auth.ts экспорт идет не так, как я чувствую. Пожалуйста, внесите следующие изменения и попробуйте
import { Request, Response } from "express"; import jwt, { JwtPayload } from "jsonwebtoken"; function getConnectedPerson(req: Request, res: Response, next) { try { const token = req.headers.authorization.split(' ')[1]; const { personId } = jwt.verify(token, process.env.TOKEN_SEED) as JwtPayload; res.locals.personId = personId; next(); } catch { res.status(401).send("Invalid request"); } } function getConnectedPerson_1(req: Request, res: Response, next) { // some operation console.log("second function export"); next(); } exports.getConnectedPerson = getConnectedPerson; exports.getConnectedPerson_1 = getConnectedPerson_1;
в контроллере :-
import { Request, Response, Router } from "express"; import { autoInjectable } from "tsyringe"; //const authMiddleware = require("auth") const { getConnectedPerson, getConnectedPerson_1 } =require("./auth") @autoInjectable() export class ActivityController { constructor() { } initRoutes(router: Router) { router.get('/activities', [ getConnectedPerson, getConnectedPerson_1 ],async (req: Request, res: Response) =gt; {}); }
}
Комментарии:
1. спасибо за подсказку. Однако с вашим решением я могу реализовать только одну функцию для каждого модуля, и я хочу, чтобы в моем модуле было несколько функций для экспорта.
2. Вы можете иметь любое количество функций в модуле и экспортировать их. Это не проблема.
3. К сожалению, когда я реализую ваше предложение, оно работает, но только до тех пор, пока я объявляю только одну функцию. Как только я объявляю вторую функцию, я получаю то же сообщение об ошибке:
Error: Route.get() requires a callback function but got a [object Object]
4. Пожалуйста, проверьте обновленный код. Я экспортировал несколько функций с помощью промежуточного программного обеспечения auth.
5. моя беда, проблема была из-за опечатки