NodeJS+Express+MongoDB开发REST API遇Cannot GET /api/auth/register错误求助
问题描述
我使用NodeJS、Express和MongoDB开发REST API,访问/api/auth/register路径时浏览器返回错误:Cannot GET /api/auth/register。已确认请求为GET请求,且项目中其他路由均能正常工作,无法定位错误原因,求帮忙排查。
项目代码文件
index.js
const express = require('express'); const dotenv = require("dotenv"); const helmet = require("helmet"); const morgan = require("morgan"); const bodyParser = require('body-parser'); const config = require('./config/config'); const cors = require('cors'); const app = express(); //user routes const userRoute = require("./routes/userRoute") const authRoute = require("./routes/authRoute") //middleware app.use(express.json()); app.use(helmet()); app.use(cors()); app.use(morgan("common")); app.use("/api/user", userRoute); app.use("/api/auth", authRoute); //connexion to DB const mongoose = require('mongoose'); mongoose.connect(process.env.MONGODB_URI,(err) => { if(!err) { console.log ('MongoDB connection succeded'); } else { console.log ('Error in MongoDB connection : ' + JSON.stringufy(err, undefined, 2)); } }); app.listen(process.env.PORT, () => console.log(`Server started at port : ${process.env.PORT}`));
userRoute.js
const express = require('express'); const mongoose = require('mongoose'); const User = require('../models/User'); const router = require("express").Router(); router.get("/",(req,res)=>{ res.send('user route'); //ok }) //register // cannot GET router.get("/register", async (req,res)=>{ const user = await new User({ username:"john", email:"john@gmail.com", password:"azerty" }) await user.save(); res.send("ok"); }) module.exports = router;
authRoute.js
const express = require('express'); const mongoose = require('mongoose'); const User = require('../models/User'); const router = require("express").Router(); router.get("/",(req,res)=>{ res.send('user auth'); //ok }) module.exports = router;
User 模型(user.js)
const mongoose = require('mongoose') const UserSchema = new mongoose.Schema({ username:{ type:String, require: true, min: 3, max: 20, unique:true }, email:{ type:String, require: true, max: 50, unique:true }, password:{ type:String, require: true, min: 4, unique:true }, profilPicture:{ type:String, default:"" }, coverPicture:{ type:String, default:"" }, followers:{ type:Array, default:[] }, followins:{ type:Array, default:[] }, isAdmin:{ type:Boolean, default:false }, }, {timestamps:true} ) module.exports = mongoose.model("User", UserSchema);
config.json
{ "development": { "PORT": 3000, "MONGODB_URI": "mongodb://localhost:27017/socialmedia", "JWT_SECRET": "SECRET#123", "JWT_EXP": "10m" }, "production": { "PORT": 80, "MONGODB_URI": "mongodb://xxxxx/DB_Name", "JWT_SECRET": "SECRET#123", "JWT_EXP": "2m" } }
config.js
// check env. var env = process.env.NODE_ENV || 'development'; // fetch env. config var config = require('./config.json'); var envConfig = config[env]; // add env. config values to process.env Object.keys(envConfig).forEach(key => process.env[key] = envConfig[key]);
package.json
{ "name": "server", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "start": "nodemon index.js" }, "author": "", "license": "ISC", "dependencies": { "bcrypt": "^5.1.0", "body-parser": "^1.20.1", "cors": "^2.8.5", "dotenv": "^16.0.3", "env": "^0.0.2", "express": "^4.18.2", "helmet": "^6.0.0", "mongoose": "^6.7.1", "morgan": "^1.10.0", "nodemon": "^2.0.20" } }
问题排查与修复
核心问题
你把/register路由定义在了userRoute.js文件中,对应的实际访问路径是/api/user/register,但你尝试访问的是/api/auth/register,而authRoute.js中并没有注册这个路由,因此返回Cannot GET错误。
修复步骤
- 迁移路由到正确文件
将userRoute.js中的/register路由移动到authRoute.js中,修改后的authRoute.js如下:
const express = require('express'); const mongoose = require('mongoose'); const User = require('../models/User'); const router = require("express").Router(); router.get("/",(req,res)=>{ res.send('user auth'); //ok }) // 迁移后的register路由 router.get("/register", async (req,res)=>{ try { const user = await new User({ username:"john", email:"john@gmail.com", password:"azerty" }) await user.save(); res.send("ok"); } catch(err) { res.status(500).send(err.message); } }) module.exports = router;
清理冗余代码
删除userRoute.js中的/register路由代码。修复其他潜在问题
- 模型中
password字段的unique:true约束不合理,实际场景中不需要密码唯一,建议移除该属性; index.js中JSON.stringufy是拼写错误,应为JSON.stringify,否则数据库连接报错时会触发新错误;- 异步路由添加
try/catch捕获错误,避免未处理的Promise异常导致服务器崩溃。
内容的提问来源于stack exchange,提问作者damian
相关产品推荐
相关产品推荐

