利用node.js+mongodb如何搭建一个简单登录注册的功能详解

yizhihongxing

下面我来详细讲解利用node.js+mongodb如何搭建一个简单登录注册的功能的攻略。

基本流程

首先,我们需要搭建node.js的环境,安装对应的依赖包,包括MongoDB、Express等。然后,我们可以创建一个项目,创建一个包含login和register两个路由的express应用。在处理控制器中,我们可以使用mongoose库来操作mongodb数据库,实现对用户的信息存储、传递和验证。

以下是一个简单的用户Schema示例:

const mongoose = require('mongoose');
const bcrypt = require('bcryptjs');

const UserSchema = new mongoose.Schema({
  username: {
    type: String,
    required: true,
    unique: true
  },
  password: {
    type: String,
    required: true
  }
});

UserSchema.pre('save', function(next) {
  const user = this;
  bcrypt.hash(user.password, 10, function(err, hash) {
    if (err) {
      return next(err);
    }
    user.password = hash;
    next();
  });
});

UserSchema.methods.comparePassword = function(candidatePassword, cb) {
  bcrypt.compare(candidatePassword, this.password, function(err, isMatch) {
    if (err) { 
      return cb(err);
    }
    cb(null, isMatch);
  });
}

module.exports = mongoose.model('User', UserSchema);

在这个Schema中,我们定义了username和password两个字段,并使用bcrypt库对密码进行hash加密。同时,我们还定义了comparePassword方法验证用户输入的密码和数据库中的密码是否匹配。

在用户注册时,我们可以使用以下代码来将用户信息保存到数据库:

const user = new User({
  username: req.body.username,
  password: req.body.password
});
user.save(function(err) {
  if (err) {
    return next(err);
  }
  res.json({'message': 'User successfully created'});
});

在用户登录时,我们可以使用以下代码检验用户信息:

User.findOne({ username: req.body.username }, function(err, user) {
  if (err) {
    return next(err);
  }
  if (!user) {
    return res.status(401).send('Invalid username or password');
  }
  user.comparePassword(req.body.password, function(err, isMatch) {
    if (isMatch && !err) {
      // 密码匹配,登录成功
    } else {
      // 密码不匹配,登录失败
    }
  });
});

示例说明

接下来,我将给出两个示例说明来帮助您更全面地了解如何搭建简单登录注册功能。

示例一:使用Express搭建登录注册功能

该示例中,我将使用Express框架来构建一个简单的应用程序,实现用户的登录和注册功能。具体步骤如下:

  1. 安装依赖和库

首先,我们需要安装必要的依赖和库,包括:Express、mongoose、bcryptjs等。可以通过以下命令进行安装:

npm install express mongoose bcryptjs --save
  1. 创建应用程序

接下来,我们创建一个名为app.js的文件,并在其中导入必要的库,以及创建express应用程序:

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

const app = express();
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
  1. 创建数据库模型和路由处理器

在app.js文件中,我们需要创建数据库模型和路由处理器。首先,我们创建用户模型:

const userSchema = new mongoose.Schema({
  username: {type: String, unique: true},
  password: String
});
userSchema.pre('save', function(next) {
  const user = this;
  if (!user.isModified('password')) return next();
  bcrypt.genSalt(10, function(err, salt) {
    if(err) return next(err);
    bcrypt.hash(user.password, salt, function(err, hash) {
      if(err) return next(err);
      user.password = hash;
      next();
    });
  });
});
userSchema.methods.comparePassword = function(candidatePassword, cb) {
  bcrypt.compare(candidatePassword, this.password, function(err, isMatch) {
    if(err) return cb(err);
    cb(null, isMatch);
  });
};
const User = mongoose.model('User', userSchema);

接下来,我们定义注册和登录的路由处理器:

// 注册
app.post('/api/register', function(req, res) {
  const user = new User({
    username: req.body.username,
    password: req.body.password
  });
  user.save(function(err) {
    if (err) {
      res.json({success: false, message: err.message});
    } else {
      res.json({success: true});
    }
  });
});

// 登录
app.post('/api/login', function(req, res) {
  User.findOne({ username: req.body.username }, function(err, user) {
    if (err) {
      return done(err);
    }
    if (!user) {
      res.json({success: false, message: 'User not found.'});
    } else {
      user.comparePassword(req.body.password, function(err, isMatch) {
        if (isMatch && !err) {
          res.json({success: true, message: 'Auth succeeded.'});
        } else {
          res.json({success: false, message: 'Auth failed.'});
        }
      });
    }
  });
});
  1. 启动应用程序

最后,我们启动应用程序,开始监听请求:

mongoose.connect('mongodb://localhost:27017/login-demo', { useNewUrlParser: true }, function(err, db) {
  if(err){
    console.log('Unable to connect to the server. Please start the server. Error:', err);
  } else {
    console.log('Connected to Server successfully!');
  }
});
app.listen(3000, ()=>{
  console.log('Server started on port 3000...');
});

示例二:使用koa2搭建登录注册功能

该示例中,我将使用koa2框架来构建一个简单的应用程序,实现用户的登录和注册功能。具体步骤如下:

  1. 安装依赖和库

首先,我们需要安装必要的依赖和库,包括:koa、koa-router、mongoose、bcrypt等。可以通过以下命令进行安装:

npm install koa koa-router mongoose bcrypt --save
  1. 创建应用程序

接下来,我们创建一个名为app.js的文件,并在其中导入必要的库,以及创建koa应用程序:

const Koa = require('koa');
const router = require('koa-router')();
const mongoose = require('mongoose');
const bodyParser = require('koa-bodyparser');
const bcrypt = require('bcrypt');

const app = new Koa();
app.use(bodyParser());
  1. 创建数据库模型和路由处理器

在app.js文件中,我们需要创建数据库模型和路由处理器。首先,我们创建用户模型:

const userSchema = new mongoose.Schema({
  username: {type: String, unique: true},
  password: String
});
userSchema.pre('save', function(next) {
  const user = this;
  if (!user.isModified('password')) return next();
  bcrypt.genSalt(10, function(err, salt) {
    if(err) return next(err);
    bcrypt.hash(user.password, salt, function(err, hash) {
      if(err) return next(err);
      user.password = hash;
      next();
    });
  });
});
userSchema.methods.comparePassword = function(candidatePassword, cb) {
  bcrypt.compare(candidatePassword, this.password, function(err, isMatch) {
    if(err) return cb(err);
    cb(null, isMatch);
  });
};
const User = mongoose.model('User', userSchema);

接下来,我们定义注册和登录的路由处理器:

// 注册
router.post('/api/register', async function(ctx, next) {
  const user = new User({
    username: ctx.request.body.username,
    password: ctx.request.body.password
  });
  await user.save().then(()=>{
    ctx.response.body = {success: true};
  }).catch((err)=>{
    ctx.response.body = {success: false, message: err.message};
  });
});

// 登录
router.post('/api/login', async function(ctx, next) {
  const user = await User.findOne({ username: req.body.username }).exec();
  if (!user) {
    ctx.response.body = {success: false, message: 'User not found.'};
  } else {
    user.comparePassword(ctx.request.body.password, function(err, isMatch) {
      if (isMatch && !err) {
        ctx.response.body = {success: true, message: 'Auth succeeded.'};
      } else {
        ctx.response.body = {success: false, message: 'Auth failed.'};
      }
    });
  }
});
  1. 启动应用程序

最后,我们启动应用程序,开始监听请求:

mongoose.connect('mongodb://localhost:27017/login-demo', { useNewUrlParser: true }, function(err, db) {
  if(err){
    console.log('Unable to connect to the server. Please start the server. Error:', err);
  } else {
    console.log('Connected to Server successfully!');
  }
});
app.use(router.routes());
app.listen(3000, ()=>{
  console.log('Server started on port 3000...');
});

到此为止,我们就完成了使用node.js+mongodb搭建一个简单登录注册的功能详解。希望对您有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:利用node.js+mongodb如何搭建一个简单登录注册的功能详解 - Python技术站

(0)
上一篇 2023年5月25日
下一篇 2023年5月25日

相关文章

  • 监控Linux系统节点和服务性能的方法

    监控系统节点和性能的方法 Linux系统提供了各种监控系统的工具,可以通过这些工具来监控系统的节点和性能。以下是一些常用的监控工具: (1) top命令 – 可以监控系统的实时进程,显示CPU和内存使用情况。 (2) netstat命令 – 可以监控网络端口的使用情况。 (3) lsof命令 – 可以监控文件系统的使用情况和打开文件的进程。 (4) vmst…

    人工智能概览 2023年5月25日
    00
  • Go实现分布式系统高可用限流器实战

    Go实现分布式系统高可用限流器实战攻略 什么是限流器? 限流器是用来控制流量的一种重要工具。在分布式系统中,限流器可以帮助我们控制流量并且保证系统的稳定运行。 Go实现分布式系统高可用限流器的步骤 以下是Go实现分布式系统高可用限流器的步骤: 1. 定义限流器的数据结构 我们需要定义一个结构体来表示限流器。这个结构体包含以下字段: 每秒钟可以处理的请求数 r…

    人工智能概览 2023年5月25日
    00
  • Yolov5服务器环境搭建详细过程

    下面我将为您详细讲解“Yolov5服务器环境搭建详细过程”的完整攻略。 1. 安装Python3及相关依赖 首先,您需要安装Python3的运行环境,同时还需要安装在运行 YOLOv5 时需要用到的相关依赖。具体可以按照以下命令进行安装: # 安装python3 sudo apt-get install python3 # 安装pip依赖 sudo apt-…

    人工智能概览 2023年5月25日
    00
  • Nginx的信号控制

    Nginx是一个高性能的Web服务器,也是一个反向代理服务器。在Nginx运行期间,我们可以通过向其发送不同的信号来控制其行为。这些信号包括但不限于关闭、重载配置文件、重新打开日志文件等等。本篇文章将对Nginx信号控制进行详细介绍,包括具体操作和示例说明。 Nginx的信号控制 Nginx主进程会监听各类信号,进而来改变其执行状态。Nginx的信号可以分为…

    人工智能概览 2023年5月25日
    00
  • php7安装mongoDB扩展的方法分析

    安装MongoDB扩展是PHP开发中常见的需求之一,本篇攻略将详细介绍在PHP7上安装MongoDB扩展的方法以及相关的配置和使用细节。 前置条件 在开始之前,需要确保以下条件已具备: 已安装PHP7及MongoDB服务端 已安装PECL扩展管理工具(可通过命令pecl version检测是否已安装) 安装MongoDB PHP扩展 打开命令行工具(终端或C…

    人工智能概论 2023年5月25日
    00
  • pytorch标签转onehot形式实例

    下面是详细讲解“pytorch标签转onehot形式实例”的完整攻略,包含两条示例说明。 什么是标签标注 标签标注就是将离散数据用数字标号来表示。比如,对于一个三分类问题,我们可能将标签分别表示为0,1,2,这就是一种标签标注方式。 为什么需要将标签转为onehot形式 在深度学习中,常常会有需要对数据进行编码的情况,特别是对于有序分类或连续性数据的编码,可…

    人工智能概论 2023年5月25日
    00
  • django中url映射规则和服务端响应顺序的实现

    一、django中url映射规则的实现 在Django中,我们可以通过URL配置文件(urls.py)来定义URL和视图的映射规则。其中,常见的映射规则有以下三种: 1.基于函数的视图映射 使用“urlpatterns”中的“path”和“re_path”配置函数或类视图。 示例: from django.urls import path from . im…

    人工智能概览 2023年5月25日
    00
  • Python Web框架Tornado运行和部署

    下面我来详细讲解一下Python Web框架Tornado的运行和部署攻略。 Tornado的部署 1.环境准备 安装Python3.x(如果已经安装,则忽略) 安装pip工具(如果已经安装,则忽略) 安装Tornado包 在安装Tornado包时可以使用以下命令: pip install tornado 2.编写Web应用代码 以下是一个示例的Tornad…

    人工智能概览 2023年5月25日
    00
合作推广
合作推广
分享本页
返回顶部