如何修复[nodemon]应用崩溃及express-jwt的TypeError问题?
项目启动报错:TypeError: Object(...) is not a function
我和朋友协作开发项目时,执行npm run development命令启动项目,出现如下错误:
const requireSignin = Object(express_jwt__WEBPACK_IMPORTED_MODULE_2__["expressJwt"])({ ^ TypeError: Object(...) is not a function at Module.eval (webpack:///./server/controllers/auth.controller.js?:58:85) at eval (webpack:///./server/controllers/auth.controller.js?:95:30) at Module../server/controllers/auth.controller.js (/Users/mihailomitrovic/Downloads/iteh_projekat/dist/server.generated.js:420:1) at __webpack_require__ (/Users/mihailomitrovic/Downloads/iteh_projekat/dist/server.generated.js:21:30) at Module.eval (webpack:///./server/routes/user.routes.js?:5:86) at eval (webpack:///./server/routes/user.routes.js?:36:30) at Module../server/routes/user.routes.js (/Users/mihailomitrovic/Downloads/iteh_projekat/dist/server.generated.js:540:1) at __webpack_require__ (/Users/mihailomitrovic/Downloads/iteh_projekat/dist/server.generated.js:21:30) at Module.eval (webpack:///./server/express.js?:17:77) at eval (webpack:///./server/express.js?:165:30) at Module../server/express.js (/Users/mihailomitrovic/Downloads/iteh_projekat/dist/server.generated.js:468:1) at __webpack_require__ (/Users/mihailomitrovic/Downloads/iteh_projekat/dist/server.generated.js:21:30) at eval (webpack:///./server/server.js?:3:66) at Module../server/server.js (/Users/mihailomitrovic/Downloads/iteh_projekat/dist/server.generated.js:552:1) at __webpack_require__ (/Users/mihailomitrovic/Downloads/iteh_projekat/dist/server.generated.js:21:30) at eval (webpack:///multi_./server/server.js?:1:18) [nodemon] app crashed - waiting for file changes before starting...
我已尝试查找解决方案并检查代码,但至今没有效果。请问这是否与模块导入有关?能否提供帮助或指明解决方向?
以下是报错指向的auth.controller.js代码:
import User from '../models/user.model' import jwt from 'jsonwebtoken' import { expressJwt } from 'express-jwt' import config from './../../config/config' const signin = async (req, res) => { try { let user = await User.findOne({ "email": req.body.email }) if (!user) return res.status('401').json({ error: "User not found" }) if (!user.authenticate(req.body.password)) { return res.status('401').send({ error: "Email and password don't match." }) } const token = jwt.sign({ _id: user._id }, config.jwtSecret) res.cookie("t", token, { expire: new Date() + 9999 }) return res.json({ token, user: { _id: user._id, name: user.name, email: user.email } }) } catch (err) { return res.status('401').json({ error: "Could not sign in" }) } } const signout = (req, res) => { res.clearCookie("t") return res.status('200').json({ message: "signed out" }) } const requireSignin = expressJwt({ secret: config.jwtSecret, userProperty: 'auth' }) const hasAuthorization = (req, res, next) => { const authorized = req.profile && req.auth && req.profile._id == req.auth._id if (!(authorized)) { return res.status('403').json({ error: "User is not authorized" }) } next() } export default { signin, signout, requireSignin, hasAuthorization }
解决方向
这个错误确实和模块导入有关,核心原因是express-jwt版本的导出方式变更:
- express-jwt v4及以上版本采用默认导出,不再支持
{ expressJwt }这种命名解构导入 - 你的代码里用了解构导入,导致
expressJwt是undefined,调用时就会抛出Object(...) is not a function错误
方案1:修改导入语句(推荐)
把auth.controller.js里的导入代码改成默认导入:
import expressJwt from 'express-jwt'
注意:v4+版本的配置参数也有变化,若启动后仍有报错,需把secret参数改成嵌套对象形式:
const requireSignin = expressJwt({ secret: { secret: config.jwtSecret }, userProperty: 'auth' })
方案2:降级express-jwt版本
如果不想修改代码,可以降级到支持命名导出的v3.x版本:
npm uninstall express-jwt && npm install express-jwt@3.4.0
内容的提问来源于stack exchange,提问作者Mihailo
相关产品推荐
相关产品推荐

