- 准备工作
首先需要安装Node.js和MongoDB,并在本地创建一个数据库。然后使用命令行工具(或者使用可视化工具)创建users集合来存放用户相关信息。
接着使用NPM安装Express框架和相关的库(如body-parser、mongoose、bcrypt等),可以使用以下命令:
npm install express body-parser mongoose bcrypt --save
- 创建Express app和路由
首先在根目录创建一个app.js文件,并在其中引用需要的模块和库,将app对象实例化,并设置路由。
// app.js
const express = require('express');
const bodyParser = require('body-parser');
const mongoose = require('mongoose');
const bcrypt = require('bcrypt');
const app = express();
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
// 设置路由
app.use('/auth', require('./routes/auth'));
module.exports = app;
在routes文件夹下新建一个auth.js文件,并设置路由。
// auth.js
const express = require('express');
const router = express.Router();
const mongoose = require('mongoose');
const bcrypt = require('bcrypt');
// 用户注册
router.post('/register', (req, res) => {
// 获取请求的参数
const { name, email, password } = req.body;
// 判断用户信息是否已存在
User.findOne({ email })
.then(user => {
if(user) {
res.status(400).json({ message: '该邮箱已被注册!' });
} else {
const salt = bcrypt.genSaltSync(10);
const hash = bcrypt.hashSync(password, salt);
// 创建新用户
const newUser = new User({
name,
email,
password: hash
});
newUser.save()
.then(user => {
res.status(200).json({ message: '注册成功!', user });
})
.catch(err => {
res.status(500).json({ message: err.message });
});
}
})
.catch(err => {
res.status(500).json({ message: err.message });
});
});
module.exports = router;
- 连接MongoDB数据库
为了能够连接MongoDB数据库,我们需要在app.js里面设置我们的数据库链接字符串,如下所示:
// app.js
const { MONGODB_URI } = require('./config');
mongoose.connect(MONGODB_URI, {
useNewUrlParser: true,
useUnifiedTopology: true
})
.then(() => {
console.log('MongoDB Connected!');
})
.catch(err => {
console.error(err);
});
其中,config.js文件保存了MongoDB数据库的链接信息。
- 创建和保存用户数据
在models文件夹下新建一个user.js文件,并定义User模型。
// user.js
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const UserSchema = new Schema({
name: String,
email: String,
password: String
});
const User = mongoose.model('user', UserSchema);
module.exports = User;
然后在auth.js中引用User模型,并在注册路由中根据请求参数创建和保存新用户。
// auth.js
const express = require('express');
const router = express.Router();
const mongoose = require('mongoose');
const bcrypt = require('bcrypt');
const User = require('../models/user');
// 用户注册
router.post('/register', (req, res) => {
// 获取请求的参数
const { name, email, password } = req.body;
// 判断用户信息是否已存在
User.findOne({ email })
.then(user => {
if(user) {
res.status(400).json({ message: '该邮箱已被注册!' });
} else {
const salt = bcrypt.genSaltSync(10);
const hash = bcrypt.hashSync(password, salt);
// 创建新用户
const newUser = new User({
name,
email,
password: hash
});
newUser.save()
.then(user => {
res.status(200).json({ message: '注册成功!', user });
})
.catch(err => {
res.status(500).json({ message: err.message });
});
}
})
.catch(err => {
res.status(500).json({ message: err.message });
});
});
module.exports = router;
- 用户登录
在auth.js中添加登录路由,并在其中验证用户输入和数据库中存储的用户信息是否匹配。
// auth.js
const express = require('express');
const router = express.Router();
const mongoose = require('mongoose');
const bcrypt = require('bcrypt');
const User = require('../models/user');
// 用户注册
router.post('/register', (req, res) => {
// 获取请求的参数
const { name, email, password } = req.body;
// 判断用户信息是否已存在
User.findOne({ email })
.then(user => {
if(user) {
res.status(400).json({ message: '该邮箱已被注册!' });
} else {
const salt = bcrypt.genSaltSync(10);
const hash = bcrypt.hashSync(password, salt);
// 创建新用户
const newUser = new User({
name,
email,
password: hash
});
newUser.save()
.then(user => {
res.status(200).json({ message: '注册成功!', user });
})
.catch(err => {
res.status(500).json({ message: err.message });
});
}
})
.catch(err => {
res.status(500).json({ message: err.message });
});
});
// 用户登录
router.post('/login', (req, res) => {
// 获取请求的参数
const { email, password } = req.body;
// 根据email查找用户
User.findOne({ email })
.then(user => {
if(!user) {
res.status(404).json({ message: '该用户不存在!' });
} else {
// 比对密码
bcrypt.compare(password, user.password, (err, success) => {
if(success) {
res.status(200).json({ message: '登录成功!', user });
} else {
res.status(404).json({ message: '用户名或密码错误!' });
}
});
}
})
.catch(err => {
res.status(500).json({ message: err.message });
});
});
module.exports = router;
- 示例说明
示例一:用户注册
在浏览器中输入创建的注册页面的URL,比如http://localhost:3000/register,填写用户信息表单,例如:
{
"name": "test",
"email": "test@demo.com",
"password": "123456"
}
点击提交按钮后,服务器会将获取到的用户信息插入到MongoDB中的users集合中,返回注册成功的提示信息及用户的相关信息。
示例二:用户登录
在浏览器中输入创建的登录页面的URL,比如http://localhost:3000/login,填写登录信息表单,例如:
{
"email": "test@demo.com",
"password": "123456"
}
点击登录按钮后,服务器会根据输入的email从MongoDB中的users集合中获取用户信息,并进行密码比对,如果验证通过,返回登录成功的提示信息及用户的相关信息。如果密码比对失败,则返回用户名或密码错误的提示信息。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Node+Express+MongoDB实现登录注册功能实例 - Python技术站