#javascript #node.js #express #routes #router
Вопрос:
Я понятия не имею, почему я продолжаю получать эту ошибку:
C:UsersyuritDesktopEcommcereAPInode_modulesexpresslibrouterroute.js:202 throw new Error(msg); ^ Error: Route.put() requires a callback function but got a [object Undefined] at Route.lt;computedgt; [as put] (C:UsersyuritDesktopEcommcereAPInode_modulesexpresslibrouterroute.js:202:15) at Function.proto.lt;computedgt; [as put] (C:UsersyuritDesktopEcommcereAPInode_modulesexpresslibrouterindex.js:510:19) at Object.lt;anonymousgt; (C:UsersyuritDesktopEcommcereAPIroutesuser.js:7:8) at Module._compile (internal/modules/cjs/loader.js:1085:14) at Object.Module._extensions..js (internal/modules/cjs/loader.js:1114:10) at Module.load (internal/modules/cjs/loader.js:950:32) at Function.Module._load (internal/modules/cjs/loader.js:790:12) at Module.require (internal/modules/cjs/loader.js:974:19) at require (internal/modules/cjs/helpers.js:93:18) at Object.lt;anonymousgt; (C:UsersyuritDesktopEcommcereAPIindex.js:5:19) [nodemon] app crashed - waiting for file changes before starting...
Я подумал, что это проблема с файлом node_modules, поэтому я удалил и переустановил его. Это не сработало. Вот другие мои файлы, которые могут содержать проблему
user.js: Я думаю, что это здесь, в user.js файл, но я опубликую другие 2, связанные с этим файлом, просто в случае
const { verifyToken, verifyTokenAndAuthorization } = require("./verifyToken"); const router = require("express").Router(); //UPDATE router.put("/:id", verifyTokenAndAuthorization, async (req, res) =gt; { if (req.body.password) { req.body.password = CryptoJS.AES.encrypt( req.body.password, process.env.PASS_SEC ).toString(); } try { const updatedUser = await User.findByIdAndUpdate( req.params.id, { $set: req.body, }, { new: true } ); res.status(200).json(updatedUser); } catch (err) { res.status(500).json(err); } }); module.exports = router;
verifyToken.js:
const jwt = require("jsonwebtoken"); const verifyToken = (req, res, next) =gt; { const authHeader = req.headers.token; if (authHeader){ jwt.verify(token, process.env.JWT_SEC, (err,user) =gt; { if(err) res.status(403).json("Token is not valid!"); req.user = user; next(); }) } else { return res.status(401).json("You are not authenticated"); } const verifyTokenAndAuthorization = (req, res, next) =gt; { verifyToken(req, res, () =gt; { if (req.user.id === req.params.id || req.user.isAdmin){ next(); } else { rez.status(403).json("You are not all to do that!"); } }) } module.exports = { verifyToken, verifyTokenAndAuthorization}; }
auth.js:
const router = require("express").Router(); const User = require("../models/User"); const CryptoJS = require("crypto-js"); const jwt = require("jsonwebtoken"); //REGISTER router.post("/register", async (req,res) =gt; { const newUser = new User({ username: req.body.username, email: req.body.email, password: CryptoJS.AES.encrypt(req.body.password, process.env.PASS_SEC).toString(), }); try { const savedUser = await newUser.save(); res.status(201).json(savedUser); } catch (err) { res.status(500).json(err); } }); //LOGIN router.post("/login", async (req,res) =gt; { try { const user = await User.findOne({ username: req.body.username}); !user amp;amp; res.status(401).json("Wrong credentials!") const hashedPassword = CryptoJS.AES.decrypt( user.password, process.env.PASS_SEC ); const OriginalPassword = hashedPassword.toString(CryptoJS.enc.Utf8); OriginalPassword !== req.body.password amp;amp; res.status(401).json("Wrong credentials"); const accessToken = jwt.sign( { id: user._id, isAdmin: user.isAdmin, }, process.env.JWT_SEC, {expiresIn: "3d"} ); const { password, ...others} = user._doc; res.status(200).json({...others, accessToken}); } catch (err) { res.status(500).json(err); } }); module.exports = router;
Я приношу извинения, если этот пост в основном является кодом, я просто не знаю, что еще сказать, потому что я, честно говоря, не знаю, в чем проблема. Любая помощь будет очень признательна
Ответ №1:
Если вы console.log(verifyToken)
или verifyTokenAndAuthorization
вы получите undefined
Есть проблема с тем, как вы создали verifyTokenAndAuthorization
функцию и ваши module.exports
. Функция module.exports
должна быть вне verifyToken
функции, и verifyTokenAndAuthorization
функция не должна быть вложена внутри verifyToken
функции.