Postman调用refresh_token接口报CANNOT POST错误求助
问题:调用refresh_token接口返回CANNOT POST错误
完成用户注册并获取access token后,在Postman中调用refresh_token接口时,虽已成功获取到cookie,但返回体提示CANNOT POST错误。以下是相关代码,请求排查解决:
用户控制器代码
const Users = require('../models/userModel'); const bcrypt = require('bcrypt'); const { createReadStream } = require('fs'); const jwt = require('jsonwebtoken'); const userCtr = { register : async(req, res) => { try { const { name , email , password}= req.body; const user = await Users.findOne({email}) if ( user ) return res.status(400).json({msg : "The email already exists."}) if(password.length < 6) return res.status(400).json({msg : "Password is at least 6 characters long."}) // password encryption const passwordHash = await bcrypt.hash(password, 10); const newUser = new Users({ name , email , password : passwordHash }) // save mongoDB await newUser.save(); // create jwt to authenticate const accesstoken = createAccessToken({id : newUser._id}) const refreshtoken = createRefreshToken({id : newUser._id}) res.cookie('refreshtoken' , refreshtoken , { httpOnly : true , path : '/user/refresh_token' }) res.json({accesstoken}) } catch (err) { return res.status(500).json({msg : err.message}) } } , refreshtoken : async ( req , res )=>{ try { const rf_token = req.cookies.refreshtoken; if(!rf_token)return res.status(400).json({msg :" login or register"}); jwt.verify(rf_token, process.env.REFRESH_SECRET,(err , user)=>{ if(err)return res.status(400).json({msg : "login or register"}); const accesstoken = createAccessToken({id : user.id}) res.json({user , accesstoken}) }) } catch(err) { return res.status(500).json({msg : err.message}); } } } const createAccessToken=(payload)=>{ return jwt.sign(payload, process.env.JWT_SECRET , {expiresIn : "1d"}); } const createRefreshToken=(payload)=>{ return jwt.sign(payload, process.env.REFRESH_SECRET, {expiresIn : "7d"}); } module.exports = userCtr;
服务器代码
const express = require('express'); const app = express(); const bodyParser = require('body-parser'); app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: true })); const mongoose = require('mongoose'); require('dotenv').config(); const cookieParser = require('cookie-parser'); app.use(cookieParser()); const PORT = process.env.PORT || 3000; app.get('/', (req, res) => { res.json({ message: 'Hello World!' }); }) app.listen(PORT, () => { console.log(`Server is running on port ${PORT}`); }); // routes app.use('/user' , require('./routes/userRoute')); // connect mongo const URI = process.env.MONGODB_URL ; mongoose.connect(URI, {}) .then(() => { console.log('Connected to MongoDB'); }).catch(err =>{ console.log(err); });
路由代码
const router = require('express').Router(); const userCtr = require('../controllers/userController'); router.post('/register', userCtr.register); router.post('/refreshtoken', userCtr.refreshtoken); module.exports = router;
问题排查与解决方案
核心问题:路径不匹配
- Cookie路径与接口路径不一致:注册接口中设置cookie的
path为/user/refresh_token,但路由中refresh接口的路径是/refreshtoken,结合服务器的/user前缀,实际接口路径为/user/refreshtoken。Cookie的路径必须与请求接口的路径匹配才能被携带。 - 请求路径错误:你在Postman中可能调用了错误的路径
/user/refresh_token(带下划线),但服务器并没有注册该路径的POST路由,因此返回CANNOT POST。
修复步骤
- 修正Cookie路径:在用户控制器的
register方法中,将cookie的path改为/user/refreshtoken:res.cookie('refreshtoken', refreshtoken, { httpOnly: true, path: '/user/refreshtoken' // 去掉下划线,与接口路径一致 }) - 调用正确的接口路径:在Postman中请求
http://localhost:3000/user/refreshtoken(确保端口与服务器一致),请求方法为POST。 - 额外检查:确认路由文件
userRoute.js的路径正确,服务器中require('./routes/userRoute')的路径与实际文件位置匹配。
内容的提问来源于stack exchange,提问作者nimit sodhani
相关产品推荐
相关产品推荐

