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
相关产品推荐
相关产品推荐

