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: trueunique: 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处理用户注册和登录逻辑时遇到了一些问题。以下是对你代码的一些解释和改进建议。

用户注册

  1. 错误检查if (doc=[]) 这里应该是 if (doc.length === 0) 来检查查询结果是否为空。
  2. 保存用户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');
                }
            });
        }
    });
});

用户登录

  1. 密码比较if (doc.password = req.body.user.password) 这里是赋值操作而不是比较,应改为 ===
  2. 查询结果doc 是一个数组,你应该使用 doc[0] 来访问第一个匹配项。
  3. 会话管理:确保 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 正确管理用户会话信息。
回到顶部