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

Express(Node.js)中导出函数表达式作为路由回调报错如何解决

问题解答

核心问题

你的模块导出与导入语法不匹配,导致路由注册时传入的是模块导出对象,而非预期的路由处理函数:

  • 服务文件中使用命名导出:exports.loginService = ...的写法是将loginService作为属性挂载到模块导出对象上,最终模块导出的是{ loginService: 路由处理函数 }的对象,不是函数本身。
  • 路由文件中错误使用默认导入:直接const loginService = require("../../services/authServices")拿到的是上述整个导出对象,不是里面的函数,所以Express校验路由回调时抛出类型错误。

修复方案

二选一即可:

方案一:调整导入语句,解构出目标函数

修改路由文件的导入代码:

// 从导出对象中解构获取loginService函数
const { loginService } = require("../../services/authServices")

router.post("/login", loginService);

方案二:调整导出语句,改为默认导出函数

修改服务文件的导出代码:

// 直接将函数作为模块导出内容
module.exports = async(req,res) => {
  // 原有函数逻辑保持不变
  const { workerId, workerPassword } = req.body;
  try {
    const foundUser = await User.findOne({ workerId });
    if (!foundUser) {
      return res.status(404).json({
        message: "Employee does not exist (Invalid Employee ID)",
      });
    } else if (foundUser.totalLoginAttemptLeft > 0) {
      const { updatedWorker, isMatch } = await checkPassword(
        workerPassword,
        foundUser
      );
      if (!isMatch) {
        passwordNotMatched(res, updatedWorker);
      } else {
        const jwtToken = await totalLogin(foundUser, reset);
        return res.status(200).json({ token: "Bearer " + jwtToken });
      }
    } else {
      return res.status(400).json({
        message: "You'r account is locked Please contact to ADMIN or HR",
      });
    }
  } catch (error) {
    console.error(error.message);
    return res.status(500).json({ message: error.message });
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 17:27:04