Nodejs 关于schema。。我都干了些什么
Nodejs 关于schema。。我都干了些什么
schema声明
var Schema = mongoose.Schema;
var ObjectId = Schema.ObjectId;
var User = new Schema({
username : String ,
password: String
});
var User = mongoose.model('User',User);
注册功能
输入的用户名是eee 密码是eee
//注册
app.post('/doregister',function(req,res){
console.log(req.body.user);// 输出{username:'eee',password:'eee'}
User.find({username:req.body.user.username},function(err,doc){
console.log(doc);
if (doc=[]){
console.log('can');//输出can
var user = new User(req.body.user);
user.save(function(err){
if(!err){
console.log('register success!');
console.log('user:'+req.body.user);//user [Object Object]
res.redirect('/index');
}else{
res.redirect('/register');
}
});
}else{
console.log('can t');
res.redirect('/register');
}
});
});
用eee & eee登陆的时候
app.post('/dologin',function(req,res){
User.find({username:req.body.user.username},function(err,doc){
if(doc.password = req.body.user.password){
console.log("登陆成功");
req.session.user = doc;
console.log(req.session.user);// 就是这个特别奇葩 输出是[{ _id:***********,username:'eee',password:'eee',__v:'0'},password:'eee']
res.redirect('/');
}else{
res.redirect('/login');
}
console.log(req.session.user.username);//undefined
console.log(req.session.user.password);//eee
});
});
what?!!why?!!
4 回复
当然可以。我们来逐步分析并改进你的代码,确保其正确性与安全性。
1. Schema 声明
首先,你的 Schema
声明看起来没有问题。但是,为了更好的实践,我们可以使用 mongoose
提供的类型定义来增强代码的可读性和健壮性:
const mongoose = require('mongoose');
const userSchema = new mongoose.Schema({
username: { type: String, required: true, unique: true },
password: { type: String, required: true }
});
const User = mongoose.model('User', userSchema);
这里我们添加了 required: true
和 unique: true
属性来确保 username
字段是必需且唯一的。
2. 注册功能
接下来,让我们改进注册功能。我们需要确保用户不存在时才进行注册,并且密码需要加密存储(例如使用 bcrypt):
const bcrypt = require('bcrypt');
app.post('/doregister', async function(req, res) {
const { username, password } = req.body.user;
try {
// 检查用户是否已存在
const existingUser = await User.findOne({ username });
if (existingUser) {
console.log('Username already exists.');
return res.redirect('/register');
}
// 加密密码
const hashedPassword = await bcrypt.hash(password, 10);
// 创建新用户
const newUser = new User({
username,
password: hashedPassword
});
await newUser.save();
console.log('Register success!');
res.redirect('/index');
} catch (error) {
console.error(error);
res.redirect('/register');
}
});
3. 登录功能
登录功能也需要改进,确保密码匹配并且使用会话管理:
app.post('/dologin', async function(req, res) {
const { username, password } = req.body.user;
try {
// 查找用户
const user = await User.findOne({ username });
if (!user) {
console.log('User not found.');
return res.redirect('/login');
}
// 验证密码
const isMatch = await bcrypt.compare(password, user.password);
if (!isMatch) {
console.log('Invalid password.');
return res.redirect('/login');
}
// 设置会话
req.session.user = user;
console.log('Login success!');
res.redirect('/');
} catch (error) {
console.error(error);
res.redirect('/login');
}
});
总结
- 使用
mongoose
的类型定义来增强Schema
。 - 使用
bcrypt
来加密密码。 - 确保用户唯一性检查。
- 正确处理异步操作(使用
async/await
)。 - 安全地管理会话。
这样,你的应用将更加健壮和安全。希望这对你有所帮助!
===
写成了=
no~ 的确应该是 = 不信可以试验
根据你的描述,你在使用Mongoose处理用户注册和登录逻辑时遇到了一些问题。以下是对你代码的一些解释和改进建议。
用户注册
- 错误检查:
if (doc=[])
这里应该是if (doc.length === 0)
来检查查询结果是否为空。 - 保存用户:
var user = new User(req.body.user);
创建新用户实例是正确的,但应该确保数据格式正确。
改进后的注册代码:
app.post('/doregister', function(req, res) {
console.log(req.body.user); // 输出 { username: 'eee', password: 'eee' }
User.findOne({ username: req.body.user.username }, function(err, doc) {
if (doc) {
console.log('can t');
res.redirect('/register');
} else {
var user = new User(req.body.user);
user.save(function(err) {
if (!err) {
console.log('register success!');
res.redirect('/index');
} else {
console.log('Error during registration:', err);
res.redirect('/register');
}
});
}
});
});
用户登录
- 密码比较:
if (doc.password = req.body.user.password)
这里是赋值操作而不是比较,应改为===
。 - 查询结果:
doc
是一个数组,你应该使用doc[0]
来访问第一个匹配项。 - 会话管理:确保
req.session
正确配置并已启用。
改进后的登录代码:
app.post('/dologin', function(req, res) {
User.findOne({ username: req.body.user.username }, function(err, doc) {
if (doc && doc.password === req.body.user.password) {
console.log("登陆成功");
req.session.user = doc;
console.log(req.session.user); // 输出 { _id: ..., username: 'eee', password: 'eee', __v: 0 }
res.redirect('/');
} else {
console.log("登陆失败");
res.redirect('/login');
}
});
});
总结
- 使用
findOne
替代find
,因为通常只需要一个文档。 - 检查查询结果是否为空或存在。
- 确保正确比较密码,不要使用赋值操作符。
- 使用
req.session
正确管理用户会话信息。