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

Next.js+Auth.js+Mongoose中高阶函数的正确返回类型定义问题

问题解决:控制器无返回值+TypeScript类型报错

1. 解决返回值为undefined的问题

你的高阶函数里没有返回控制器的执行结果,而且控制器是async函数(返回Promise),必须await它并返回,否则外层async函数会默认返回undefined:

修改withDBConnection的try块代码:

// 原代码
Controller(...args);

// 修改后
return await Controller(...args);

这样外层函数会把控制器的异步执行结果返回出去,调用await getUser(user.email)时就能拿到正确的user值。

2. 修复TypeScript类型报错问题

原来的Controller类型用any过于模糊,需要给高阶函数加上泛型参数,让TypeScript能正确推断参数和返回值类型:

修改后的完整类型定义与高阶函数:

// 定义精确的控制器类型,支持泛型参数和返回值
type Controller<Args extends any[], Return> = (...args: Args) => Promise<Return>;

export const withDBConnection = <Args extends any[], Return>(
  controller: Controller<Args, Return>
): ((...args: Args) => Promise<Return>) => {
  return async (...args: Args) => {
    try {
      await dbStartConnection();
      return await controller(...args);
    } catch (error) {
      console.log("inside withDBConnection catch block");
      console.log((error as AppError).message);
      // 建议重新抛出错误,让调用方可以捕获处理
      throw error;
    }
  };
};

使用示例(TypeScript会自动推断类型,不再报参数错误):

// 假设Auth.find返回Document数组,类型会被自动推断
export const getUser = withDBConnection(async (email: string) => {
  const user = await Auth.find({ discordEmail: email });
  console.log("getUser", user);
  return user;
});

// 调用时类型完全匹配,isExist会被推断为Document[]
const isExist = await getUser(user.email);

补充说明

  • 重新抛出错误:原catch块仅打印错误但未传递给调用方,加上throw error后,调用方可以通过try/catch处理数据库连接或控制器执行中的错误。
  • 类型精确化:通过泛型参数约束,TypeScript能自动校验控制器的参数类型,并推断返回值类型,既解决了参数报错问题,也提升了代码的类型安全性。

内容的提问来源于stack exchange,提问作者Marya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 01:36:03