笔记Web应用用户注册报错:Internal Server Error排查求助
注册时出现Internal Server Error的排查求助
在Chrome中运行笔记Web应用,输入用户信息尝试注册时,控制台返回错误:internal server error occured。怀疑问题出在注册控制器函数,但无法定位具体原因,相关代码如下:
注册路由及函数
router.post('/createuser', [ body('name', 'Enter a valid name').isLength({min: 3}), body('email', 'Enter a valid email').isEmail(), body('password', 'Password must be atleast 5 characters').isLength({min: 5}), ], async (req, res) => { let success = false //if there are errors return bad request and the errors const errors = validationResult(req); if (!errors.isEmpty()) { return res.status(400).send({success, errors: errors.array()}); } //check whether the user with same email exists already try { const user = await User.findOne({email: req.body.email}) if (user) { return res.status(400).send({ success, message: 'Sorry a user with this email already exists' }) } const salt = await bcrypt.genSalt(10) const secPass = await bcrypt.hash(req.body.password, salt) req.body.password = secPass const newUser = new User(req.body) await newUser.save() res.status(201).send({ success: true, message: "Registered successfully" }) //catch errors } catch (error) { console.error(error.message) res.status(500).send({ success: false, message: "Internal server error occured" }) } })
注册页面代码(React)
const Signup = (props) => { const [credentials, setCredentials] = useState({ name: "", email: "", password: "", cpassword: "" }) let navigate = useNavigate() const handleSubmit = async (e) => { e.preventDefault() const { name, email, password } = credentials const response = await fetch("http://localhost:5000/api/auth/createuser", { method: 'POST', // *GET, POST, PUT, DELETE, etc. headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ name, email, password }) }); const json = await response.json() console.log(json) if (json.success) { props.showAlert("Accouct Created Successfully ", "success") navigate("/login") } else { props.showAlert("Invalid credentials", "danger") } } const onChange = (e) => { setCredentials({ ...credentials, [e.target.name]: e.target.value }) } return ( <div className='container mt-3'> <h2>Sign Up</h2> <form onSubmit={handleSubmit}> <div className="my-3"> <label htmlFor="name" className="form-label"><MdDriveFileRenameOutline style={{ "marginRight": "3px" }} /> Name</label> <input type="text" className="form-control" id="name" name='name' aria-describedby="emailHelp" onChange={onChange} /> </div> <div className="mb-3"> <label htmlFor="email1" className="form-label"><MdEmail style={{ "marginRight": "3px" }} />Email address</label> <input type="email" className="form-control" id="email" name='email' aria-describedby="emailHelp" onChange={onChange} /> </div> <div className="mb-3"> <label htmlFor="password" className="form-label"> <RiLockPasswordFill style={{ "marginRight": "3px" }} />Password</label> <input type="password" className="form-control" id="password" name='password' onChange={onChange} minLength={5} required /> </div> <div className="mb-3"> <label htmlFor="cpassword" className="form-label"><RiLockPasswordFill style={{ "marginRight": "3px" }} />Confirm Password</label> <input type="password" className="form-control" id="cpassword" name='cpassword' onChange={onChange} minLength={5} required /> </div> <button type="submit" className="btn btn-primary">Submit</button> </form> </div> ) } export default Signup
Server.js代码
const connectToMongo = require('./db') const express = require('express') const cors = require('cors') connectToMongo() const app = express() const port = 5000 app.use(cors({ origin: ['http://localhost:3000'] })) app.use(express.json()) app.use('/api/auth', require("./routes/auth")) app.use('/api/notes', require("./routes/notes")) app.listen(port, () => { console.log(`iNotebook backend app listening on port ${port}`) })
Mongoose模型
const mongoose = require('mongoose') const { Schema } = mongoose const UserSchema = new Schema({ name: { type: String, required: true }, email: { type: String, required: true, unique: true }, password: { type: String, required: true }, date: { type: Date, default: Date.now } }); const User = mongoose.model('user', UserSchema) module.exports = User
排查建议
- 打印完整错误栈:把控制器catch块里的
console.error(error.message)改成console.error(error),查看后端控制台的详细错误信息,这是定位问题的核心。 - 检查依赖安装:确认
bcrypt、express-validator、mongoose等依赖已正确安装,bcrypt可能需要编译环境,若安装失败会直接导致运行报错。 - 验证数据库连接:在
connectToMongo函数中添加连接状态日志,确认MongoDB服务是否启动、连接字符串是否正确。 - 检查请求数据:在控制器try块开头添加
console.log(req.body),确认前端发送的参数是否正确到达后端。 - 清理数据库脏数据:若数据库中已有重复email的用户记录,会触发唯一索引错误,可直接查看user集合数据。
- 前端密码校验:前端表单有确认密码字段,但提交时未做一致性校验,建议在
handleSubmit中先判断password === cpassword,避免无效请求。
内容的提问来源于stack exchange,提问作者Mustafa Mulla
相关产品推荐
相关产品推荐

