{状态: "error" , 错误: "Duplicate email" } 与 MERN



我试图将注册页面重定向到登录页面,但在注册新用户时收到了一个重复的电子邮件错误,因此它没有重定向到登录页。我相信由于这个错误,凭据没有被存储。我一定在注册文件中出错了

Register.js

import { useState } from 'react'
import { useNavigate } from 'react-router-dom';
function App() {
const navigate= useNavigate()
const [name, setName] = useState('')
const [email, setEmail] = useState('')
const [password, setPassword] = useState('')
async function registerUser(event) {
event.preventDefault()
const response = await fetch('http://localhost:1337/api/register', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
name,
email,
password,
}),
})
const data = await response.json()
if (data.status === 'ok') {
navigate.push('/login')
}
}
return (
<div>
<h1>Register</h1>
<form onSubmit={registerUser}>
<input
value={name}
onChange={(e) => setName(e.target.value)}
type="text"
placeholder="Name"
/>
<br />
<input
value={email}
onChange={(e) => setEmail(e.target.value)}
type="email"
placeholder="Email"
/>
<br />
<input
value={password}
onChange={(e) => setPassword(e.target.value)}
type="password"
placeholder="Password"
/>
<br />
<input type="submit" value="Register" />
</form>
</div>
)
}
export default App

服务器index.js

const express = require('express')
const app = express()
const cors = require('cors')
const mongoose = require('mongoose')
const User = require('./models/user.model')
const jwt = require('jsonwebtoken')
const bcrypt = require('bcryptjs')
const { response } = require('express')
app.use(cors())
app.use(express.json())
mongoose.connect('mongodb://localhost:27017/TechGenius')
app.post('/api/register', async (req, res) => {
console.log(req.body)
try {
await User.create({
name: req.body.name,
email: req.body.email,
})
res.json({ status: 'ok' })
} catch (err) {
res.json({ status: 'error', error: 'Duplicate email' })
}
})
app.post('/api/login', async (req, res) => {
const user = await User.findOne({
email: req.body.email,
})
if (!user) {
return { status: 'error', error: 'Invalid login' }
}
const isPasswordValid = await bcrypt.compare(
req.body.password,
user.password
)
if (isPasswordValid) {
const token = jwt.sign(
{
name: user.name,
email: user.email,
},
'secret123'
)
const data = await response.json()
console.log(data)
return res.json({ status: 'ok', user: token })
} else {
return res.json({ status: 'error', user: false })
}
})
app.get('/api/quote', async (req, res) => {
const token = req.headers['x-access-token']
try {
const decoded = jwt.verify(token, 'secret123')
const email = decoded.email
const user = await User.findOne({ email: email })
return res.json({ status: 'ok', quote: user.quote })
} catch (error) {
console.log(error)
res.json({ status: 'error', error: 'invalid token' })
}
})
app.post('/api/quote', async (req, res) => {
const token = req.headers['x-access-token']
try {
const decoded = jwt.verify(token, 'secret123')
const email = decoded.email
await User.updateOne(
{ email: email },
{ $set: { quote: req.body.quote } }
)
return res.json({ status: 'ok' })
} catch (error) {
console.log(error)
res.json({ status: 'error', error: 'invalid token' })
}
})
app.listen(1337, () => {
console.log('Server started on 1337')
})

user.model.js

const mongoose = require('mongoose')
const User = new mongoose.Schema(
{
name: { type: String, required: true },
email: { type: String, required: true, unique: true },
password: { type: String, required: true },
quote: { type: String },
},
{ collection: 'user-data' }
)
const model = mongoose.model('UserData', User)
module.exports = model

在您的模型中,您指出用户模型由nameemailpasswordquote组成,其中除quote外,所有这些都是必需的。

但在Register函数中,只传递nameemail,不包括password。您将catch方法上的错误硬编码为Duplicate email,这就是为什么它总是说Duplicate email。你可以尝试console.log(),也就是你捕获的error,我相信它会说密码是必填字段。

app.post('/api/register', async (req, res) => {
console.log(req.body)
try {
await User.create({
name: req.body.name,
email: req.body.email,
password: req.body.password
})
res.json({ status: 'ok' })
} catch (err) {
console.log(err)
res.json({ status: 'error', error: err.message })
}
})

最新更新