使用nodejs编写一个完整带注释的登录功能
时间: 2023-05-13 09:05:00 浏览: 76
好的,以下是使用 Node.js 编写的完整带注释的登录功能代码:
```javascript
// 引入所需模块
const express = require('express');
const bodyParser = require('body-parser');
const session = require('express-session');
const bcrypt = require('bcrypt');
const saltRounds = 10;
// 创建 express 应用
const app = express();
// 设置 bodyParser 中间件,用于解析请求体
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
// 设置 session 中间件,用于存储用户登录状态
app.use(session({
secret: 'mysecretkey',
resave: false,
saveUninitialized: true
}));
// 定义用户数据
const users = [
{
username: 'admin',
password: '$2b$10$3Y3VJFvJGZJz7X9KjZuR7Ov5Jn0h7fZ8lKJj7vZtHJZt7X9JQrZ7C' // 密码为 123456
}
];
// 定义登录路由
app.post('/login', (req, res) => {
const { username, password } = req.body;
// 查找用户
const user = users.find(user => user.username === username);
if (!user) {
// 用户不存在
res.status(401).send('用户名或密码错误');
} else {
// 验证密码
bcrypt.compare(password, user.password, (err, result) => {
if (result) {
// 密码正确,登录成功
req.session.user = user;
res.send('登录成功');
} else {
// 密码错误
res.status(401).send('用户名或密码错误');
}
});
}
});
// 定义验证登录状态的中间件
const requireLogin = (req, res, next) => {
if (req.session.user) {
// 用户已登录,继续执行下一个中间件
next();
} else {
// 用户未登录,返回 401 状态码
res.status(401).send('请先登录');
}
};
// 定义需要登录才能访问的路由
app.get('/profile', requireLogin, (req, res) => {
res.send(`欢迎 ${req.session.user.username} 访问个人资料页面`);
});
// 启动应用
app.listen(3000, () => {
console.log('应用已启动,监听端口 3000');
});
```
这是一个简单的登录功能,使用了 bcrypt 库对密码进行加密,使用了 express-session 库存储用户登录状态。登录成功后,将用户信息存储在 session 中,需要登录才能访问的路由会通过 requireLogin 中间件验证用户登录状态。