如何在TSOA中正确使用cookie-parser中间件?
问题背景
在原生Express中,我们通过以下方式使用cookie-parser:
var express = require('express') var cookieParser = require('cookie-parser') var app = express() app.use(cookieParser()) app.get('/', function (req, res) { console.log('Cookies: ', req.cookies) console.log('Signed Cookies: ', req.signedCookies) }) app.listen(8080)
但在TSOA框架中尝试用@Middlewares({ express: [cookieParser] })引入中间件时,出现错误:Error: Route.get() requires a callback function but got a [object Object]。
错误原因
TSOA的@Middlewares装饰器中,express数组需要传入已经执行过的中间件函数,而不是中间件的工厂函数本身。cookieParser是一个工厂函数,必须调用它(cookieParser())才能生成符合Express要求的中间件函数,直接传入cookieParser会导致TSOA无法识别,进而触发路由注册错误。
解决方案
方案1:全局注册(推荐,与原生Express用法一致)
在你的Express入口文件(如app.ts/server.ts)中直接注册cookieParser,所有TSOA路由都会自动继承这个中间件:
import express from 'express'; import cookieParser from 'cookie-parser'; import { RegisterRoutes } from './routes/routes'; // TSOA自动生成的路由文件 const app = express(); // 全局注册cookieParser中间件 app.use(cookieParser()); // 注册TSOA生成的路由 RegisterRoutes(app); app.listen(3000, () => { console.log('Server running on port 3000'); });
这种方式不需要修改控制器代码,控制器中直接通过request.cookies访问Cookie即可。
方案2:控制器/路由级注册(仅针对特定控制器)
如果只需要给单个控制器或特定路由启用cookieParser,需在@Middlewares中传入执行后的中间件函数:
import { Controller, Route, Get, Tags, Request, Middlewares } from 'tsoa'; import { fetchTopFiveTracks } from './routes/fetchTopFiveTracks'; import express from 'express'; import cookieParser from 'cookie-parser'; interface MultipleArtistsResponse { artistsSpotify: unknown[]; } // 注意这里是cookieParser(),而非cookieParser @Middlewares({ express: [cookieParser()] }) @Route('/TopFiveTracksController') @Tags('TopFiveTracksController') export class TopFiveTracksController extends Controller { @Get() public async topFiveTracks( @Request() request: express.Request, ): Promise<MultipleArtistsResponse> { try { const accessT = request.cookies.accessToken; const artistsSpotify = await fetchTopFiveTracks<MultipleArtistsResponse>({ method: 'GET', credentials: 'same-origin', headers: { Accept: 'application/json', Authorization: `Bearer ${accessT}`, 'Content-Type': 'application/json', }, }); console.log(accessT); console.log({ artistsSpotify }); return artistsSpotify; } catch (error) { throw new Error(JSON.stringify(error)); } } }
修改后,TSOA就能正确识别中间件,不会再抛出路由相关错误。
内容的提问来源于stack exchange,提问作者Moose
相关产品推荐
相关产品推荐

