You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在TSOA中正确使用cookie-parser中间件?

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 05:45:30