Nodejs与mysql做的用户密码验证,如果想用mongoDB实现应该如何去写

Nodejs与mysql做的用户密码验证,如果想用mongoDB实现应该如何去写

var http=require(‘http’); var fs=require(‘fs’); var qs=require(‘querystring’); var mysql=require(‘mysql’);

//1.服务 var server=http.createServer(function (request, response){ var str=’’;

request.addListener('data', function (data){
	str+=data;
});
request.addListener('end', function (){
	var post=qs.parse(str);
if(request.url.indexOf('?')!=-1)
{
	var arr=request.url.split('?');
	
	var url=arr[0];
	var get=qs.parse(arr[1]);
}
else
{
	var url=request.url;
	var get={};
}

if(url=='/user')
{
	switch(get.act)
	{
		case 'add':
			var db=mysql.createConnection({host: 'localhost', user: 'root', password: '', database: 'test'});

			db.query("SELECT * FROM user_table WHERE username='"+get.user+"'", function (err, data){
				if(err)
				{
					response.write('{err: 1, msg: "数据库出错"}');
					response.end();
				}
				else
				{
					if(data.length>0)
					{
						response.write('{err: 1, msg: "用户名已存在"}');
						response.end();
					}
					else
					{
						db.query("INSERT INTO user_table VALUES('"+get.user+"', '"+get.pass+"')", function (err, data){
							if(err)
							{
								response.write('{err: 1, msg: "数据库出错"}');
								response.end();
							}
							else
							{
								response.write('{err: 0, msg: "注册成功"}');
								response.end();
							}
						});
					}
				}
			});
			break;
		case 'login':
			//1.连接
			var db=mysql.createConnection({host: 'localhost', user: 'root', password: '', database: 'test'});
			
			db.query("SELECT * FROM user_table WHERE username='"+get.user+"'", function (err, data){
				if(err)
				{
					response.write('{err: 1, msg: "数据库出错"}');
					response.end();
				}
				else
				{
					if(data.length==0)
					{
						response.write('{err: 1, msg: "此用户名不存在"}');
						response.end();
					}
					else
					{
						if(data[0].password==get.pass)
						{
							response.write('{err: 0, msg: "登录成功"}');
							response.end();
						}
						else
						{
							response.write('{err: 1, msg: "用户名或密码有误"}');
							response.end();
						}
					}
				}
			});
			break;
	}
}
else
{
	fs.readFile('www'+url, function (err, data){
		if(err)
		{
			response.write('404');
		}
		else
		{
			response.write(data);
		}
		response.end();
	});
}

});

}); server.listen(8080);


4 回复

要将上述使用MySQL的用户密码验证逻辑迁移到MongoDB中,我们需要做几个关键的更改。首先,我们需要安装MongoDB驱动程序mongoose,这是一个用于处理MongoDB数据的流行库。然后,我们将修改查询和插入逻辑以适应MongoDB的数据模型。

以下是基于MongoDB的简化版本:

安装Mongoose

首先确保你已经安装了mongoose

npm install mongoose

修改后的代码示例

const http = require('http');
const qs = require('querystring');
const mongoose = require('mongoose');

// 初始化Mongoose连接
mongoose.connect('mongodb://localhost/test', { useNewUrlParser: true, useUnifiedTopology: true });

// 定义User Schema
const UserSchema = new mongoose.Schema({
    username: String,
    password: String // 注意:在实际应用中,密码应进行哈希处理
});

const User = mongoose.model('User', UserSchema);

// 创建HTTP服务器
const server = http.createServer((request, response) => {
    let str = '';

    request.on('data', (data) => {
        str += data;
    });

    request.on('end', () => {
        const post = qs.parse(str);

        if (request.url.indexOf('?') !== -1) {
            const arr = request.url.split('?');
            const url = arr[0];
            const get = qs.parse(arr[1]);
        } else {
            const url = request.url;
            const get = {};
        }

        if (url === '/user') {
            switch (get.act) {
                case 'add':
                    User.findOne({ username: get.user }).then(user => {
                        if (user) {
                            response.writeHead(200, { 'Content-Type': 'application/json' });
                            response.end(JSON.stringify({ err: 1, msg: '用户名已存在' }));
                        } else {
                            const newUser = new User({ username: get.user, password: get.pass });
                            newUser.save().then(() => {
                                response.writeHead(200, { 'Content-Type': 'application/json' });
                                response.end(JSON.stringify({ err: 0, msg: '注册成功' }));
                            }).catch(err => {
                                response.writeHead(200, { 'Content-Type': 'application/json' });
                                response.end(JSON.stringify({ err: 1, msg: '数据库出错' }));
                            });
                        }
                    }).catch(err => {
                        response.writeHead(200, { 'Content-Type': 'application/json' });
                        response.end(JSON.stringify({ err: 1, msg: '数据库出错' }));
                    });
                    break;

                case 'login':
                    User.findOne({ username: get.user }).then(user => {
                        if (!user) {
                            response.writeHead(200, { 'Content-Type': 'application/json' });
                            response.end(JSON.stringify({ err: 1, msg: '此用户名不存在' }));
                        } else {
                            if (user.password === get.pass) {
                                response.writeHead(200, { 'Content-Type': 'application/json' });
                                response.end(JSON.stringify({ err: 0, msg: '登录成功' }));
                            } else {
                                response.writeHead(200, { 'Content-Type': 'application/json' });
                                response.end(JSON.stringify({ err: 1, msg: '用户名或密码有误' }));
                            }
                        }
                    }).catch(err => {
                        response.writeHead(200, { 'Content-Type': 'application/json' });
                        response.end(JSON.stringify({ err: 1, msg: '数据库出错' }));
                    });
                    break;
            }
        } else {
            // 处理其他请求
        }
    });
});

server.listen(8080, () => {
    console.log('Server running at http://localhost:8080/');
});

解释

  1. Mongoose连接:我们使用mongoose.connect()来初始化与MongoDB的连接。
  2. Schema定义:定义了一个简单的用户模式,包含usernamepassword字段。
  3. CRUD操作:使用Mongoose的方法如findOne()save()来进行查询和保存操作。
  4. 错误处理:所有操作都包含了基本的错误处理,确保在发生错误时能够返回适当的响应。

注意,在实际应用中,密码不应以明文形式存储,而应该使用安全的哈希算法(如bcrypt)进行加密。


建议之前去看看mongodb的数据库操作

使用MongoDB实现用户密码验证的主要步骤包括连接到MongoDB、插入新用户、验证登录信息。以下是基于Express框架和mongoose库的简化示例代码:

安装依赖

首先确保安装了以下包:

npm install express mongoose body-parser

示例代码

const express = require('express');
const mongoose = require('mongoose');
const bodyParser = require('body-parser');

const app = express();
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());

// 连接MongoDB
mongoose.connect('mongodb://localhost:27017/mydatabase', { useNewUrlParser: true, useUnifiedTopology: true });

// 定义用户Schema
const userSchema = new mongoose.Schema({
    username: String,
    password: String
});

// 创建模型
const User = mongoose.model('User', userSchema);

// 用户注册
app.post('/register', async (req, res) => {
    try {
        const existingUser = await User.findOne({ username: req.body.username });
        if (existingUser) {
            return res.status(400).json({ err: 1, msg: "用户名已存在" });
        }
        const newUser = new User(req.body);
        await newUser.save();
        res.json({ err: 0, msg: "注册成功" });
    } catch (error) {
        res.status(500).json({ err: 1, msg: "数据库出错" });
    }
});

// 用户登录
app.post('/login', async (req, res) => {
    try {
        const user = await User.findOne({ username: req.body.username });
        if (!user) {
            return res.status(400).json({ err: 1, msg: "此用户名不存在" });
        }
        if (user.password !== req.body.password) {
            return res.status(400).json({ err: 1, msg: "用户名或密码有误" });
        }
        res.json({ err: 0, msg: "登录成功" });
    } catch (error) {
        res.status(500).json({ err: 1, msg: "数据库出错" });
    }
});

app.listen(8080, () => console.log('Server running on port 8080'));

解释

  • 连接数据库:使用mongoose.connect连接到MongoDB。
  • 定义Schema:创建用户文档结构,定义字段如usernamepassword
  • 创建模型:通过mongoose.model创建模型。
  • 处理请求:对于注册和登录请求,分别检查用户是否存在并保存或验证密码。

以上代码展示了如何从MySQL迁移到MongoDB,并使用Express和Mongoose进行基本的用户管理操作。

回到顶部