как импортировать несколько промежуточных программ express из одного модуля?

#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. моя беда, проблема была из-за опечатки