node.js实现登录注册页面

下面是详细讲解“node.js实现登录注册页面”的完整攻略。

1. 环境搭建

首先需要安装Node.js运行环境和npm包管理器,可以到Node.js官网下载并安装。

安装完成后,进入命令行工具,使用npm安装Express框架和相关的模块:

npm install express express-session express-validator body-parser cookie-parser bcryptjs --save

2. 创建项目文件夹

在命令行中输入以下指令,创建一个名为node-authentication的项目文件夹:

mkdir node-authentication
cd node-authentication

3. 创建并配置主要文件

在项目文件夹下,创建一个名为app.js的文件。这个文件将是我们的node.js项目的入口文件。

app.js中,我们需要引入相关模块,配置和初始化Express应用程序,创建并配置路由,以及设置服务器监听端口等。

以下是示例代码:

// 引入express框架和模块
const express = require('express');
const bodyParser = require('body-parser');
const cookieParser = require('cookie-parser');
const session = require('express-session');
const validator = require('express-validator');
const bcrypt = require('bcryptjs');

// 初始化Express应用程序
const app = express();

// 启用bodyParser中间件
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());

// 启用cookieParser中间件
app.use(cookieParser());

// 启用session中间件
app.use(session({
  secret: 'secret',
  resave: false,
  saveUninitialized: true
}));

// 启用Express验证器中间件
app.use(validator());

// 设置路由
app.get('/', (req, res) => {
  res.send('Hello World!');
});

// 设置服务器监听端口
app.listen(3000, () => {
  console.log('Server started on port 3000');
});

4. 创建并配置登录和注册路由

现在我们需要在我们的应用程序中添加一些路由来处理用户注册和身份验证请求。

我们将创建两个路由:/register/login。他们将处理用户注册和用户登录请求,并以不同的方式显示响应。当表单被提交时,路由将使用Express验证器中间件验证输入数据的正确性,通过bcrypt模块将密码加密,然后将其保存在数据库中。

以下是示例代码:

// 处理用户注册请求
app.post('/register', (req, res) => {
  // 表单验证
  req.checkBody('username', 'Username is required').notEmpty();
  req.checkBody('email', 'Email is required').notEmpty();
  req.checkBody('email', 'Email is not valid').isEmail();
  req.checkBody('password', 'Password is required').notEmpty();
  req.checkBody('password2', 'Passwords do not match').equals(req.body.password);

  // 检查验证错误
  const errors = req.validationErrors();
  if (errors) {
    res.render('register', { errors: errors });
  }
  else {
    // 生成密码哈希值
    bcrypt.genSalt(10, (err, salt) => {
      bcrypt.hash(req.body.password, salt, (err, hash) => {
        // 保存用户到数据库中
        const user = new User({
          username: req.body.username,
          email: req.body.email,
          password: hash
        });
        user.save(err => {
          if (err) {
            console.log(err);
          }
          else {
            req.flash('success', 'You are now registered and can login');
            res.redirect('/login');
          }
        });
      });
    });
  }
});

// 处理用户登录请求
app.post('/login', (req, res) => {
  // 表单验证
  req.checkBody('email', 'Email is required').notEmpty();
  req.checkBody('email', 'Email is not valid').isEmail();
  req.checkBody('password', 'Password is required').notEmpty();

  // 检查验证错误
  const errors = req.validationErrors();
  if (errors) {
    res.render('login', { errors: errors });
  }
  else {
    User.findOne({ email: req.body.email }, (err, user) => {
      if (err) {
        console.log(err);
      }
      else {
        // 比较密码
        bcrypt.compare(req.body.password, user.password, (err, isMatch) => {
          if (err) {
            console.log(err);
          }
          else if (isMatch) {
            // 记录用户session
            req.session.user = user;
            req.flash('success', 'You are now logged in');
            res.redirect('/');
          }
          else {
            req.flash('error', 'Invalid email or password');
            res.redirect('/login');
          }
        });
      }
    });
  }
});

5. 创建视图模板

最后,我们需要为我们的应用程序创建视图模板。我们将使用ejs模板引擎和Bootstrap框架。

我们将创建三个视图模板:index.ejslogin.ejsregister.ejs

以下是示例代码:

<!-- index.ejs -->
<!DOCTYPE html>
<html>
  <head>
    <title>Node.js Authentication App</title>
    <link href="https://cdn.bootcss.com/bootstrap/4.0.0/css/bootstrap.min.css" rel="stylesheet">
  </head>
  <body>
    <div class="container pt-3">
      <% if (success != '') { %>
        <div class="alert alert-success">
          <%= success %>
        </div>
      <% } %>
      <% if (error != '') { %>
        <div class="alert alert-danger">
          <%= error %>
        </div>
      <% } %>
      <h1>Hello <%= user.username %>!</h1>
      <a href="/logout" class="btn btn-primary">Logout</a>
    </div>
  </body>
</html>

<!-- login.ejs -->
<!DOCTYPE html>
<html>
  <head>
    <title>Node.js Authentication App</title>
    <link href="https://cdn.bootcss.com/bootstrap/4.0.0/css/bootstrap.min.css" rel="stylesheet">
  </head>
  <body>
    <div class="container pt-3">
      <% if (errors && errors.length > 0) { %>
        <div class="alert alert-danger">
          <% for (let error of errors) { %>
            <p><%= error.msg %></p>
          <% } %>
        </div>
      <% } %>
      <form action="/login" method="post">
        <div class="form-group">
          <label>Email</label>
          <input type="email" name="email" placeholder="Enter Email" class="form-control">
        </div>
        <div class="form-group">
          <label>Password</label>
          <input type="password" name="password" placeholder="Enter Password" class="form-control">
        </div>
        <button type="submit" class="btn btn-primary">Login</button>
      </form>
      <p class="mt-3">Don't have an account? <a href="/register">Register</a></p>
    </div>
  </body>
</html>

<!-- register.ejs -->
<!DOCTYPE html>
<html>
  <head>
    <title>Node.js Authentication App</title>
    <link href="https://cdn.bootcss.com/bootstrap/4.0.0/css/bootstrap.min.css" rel="stylesheet">
  </head>
  <body>
    <div class="container pt-3">
      <% if (errors && errors.length > 0) { %>
        <div class="alert alert-danger">
          <% for (let error of errors) { %>
            <p><%= error.msg %></p>
          <% } %>
        </div>
      <% } %>
      <form action="/register" method="post">
        <div class="form-group">
          <label>Username</label>
          <input type="text" name="username" placeholder="Enter Username" class="form-control">
        </div>
        <div class="form-group">
          <label>Email</label>
          <input type="email" name="email" placeholder="Enter Email" class="form-control">
        </div>
        <div class="form-group">
          <label>Password</label>
          <input type="password" name="password" placeholder="Enter Password" class="form-control">
        </div>
        <div class="form-group">
          <label>Confirm Password</label>
          <input type="password" name="password2" placeholder="Confirm Password" class="form-control">
        </div>
        <button type="submit" class="btn btn-primary">Register</button>
      </form>
      <p class="mt-3">Already have an account? <a href="/login">Login</a></p>
    </div>
  </body>
</html>

示例说明

示例1:输入不正确时的处理

在注册或登录表单中,如果有任何输入错误,我们需要通知用户并提供适当的反馈。示例代码中的Express验证器中间件在处理这个问题时非常有用。当表单被提交时,中间件将验证输入数据的正确性。如果存在错误,则在给用户提供反馈前,中间件会捕获和保存错误。示例代码中,我们使用ejs模板引擎将错误消息显示给用户。

示例2:密码安全

在示例代码中,我们使用bcrypt模块将密码哈希化。哈希化的密码是不可逆的,这意味着即使数据库被盗,黑客也不能轻易地得到用户的密码。哈希化密码还可以防止皮包或网络拦截攻击。这使用户的密码更加安全。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:node.js实现登录注册页面 - Python技术站

(0)
上一篇 2023年6月8日
下一篇 2023年6月8日

相关文章

  • 基于jstree使用JSON数据组装成树

    下面我来详细讲解“基于jstree使用JSON数据组装成树”的完整攻略。 1. jstree简介 Jstree是一个基于jQuery的树形结构插件,可以方便地将数据组装成树形结构,并支持多种事件处理。它是开源的,使用非常广泛,功能强大,而且使用简单。 2. 安装jstree 在使用jstree之前需要先引入jstree的JS和CSS文件。可以通过CDN来引入…

    node js 2023年6月8日
    00
  • nodejs结合Socket.IO实现的即时通讯功能详解

    Node.js结合Socket.IO实现的即时通讯功能详解 什么是Socket.IO Socket.IO 是一个 JavaScript 库,用于实现实时、双向、基于事件的通信。它可在不同的浏览器和操作系统下使用,并与任何服务端 — 不论它是基于 Node.js 的还是不是 — 兼容。它主要用于实现即时通讯功能,例如聊天室、弹幕等。 实现 Socket.I…

    node js 2023年6月8日
    00
  • node.js+Ajax实现获取HTTP服务器返回数据

    下面是一份详细讲解“node.js+Ajax实现获取HTTP服务器返回数据”的攻略: 一、前置知识 在学习本教程之前,读者需要掌握以下知识: HTML、CSS、JavaScript 的基础知识 Node.js 基础知识 AJAX 基础知识 二、实现步骤 本教程将分为以下几个步骤,来实现获取HTTP服务器返回数据: 创建一个服务器 获取服务器端数据 使用Aja…

    node js 2023年6月8日
    00
  • node.js中的fs.mkdirSync方法使用说明

    Node.js中的fs模块提供了文件系统相关的API,其中mkdirSync方法用于创建目录。本文将详细讲解fs.mkdirSync方法的使用说明。 fs.mkdirSync方法介绍 fs.mkdirSync方法用于同步创建目录。它的语法如下: fs.mkdirSync(path[, options]) 其中,path为要创建的目录路径,options为可选…

    node js 2023年6月8日
    00
  • node.js中的buffer.toJSON方法使用说明

    Node.js中的Buffer是用来处理二进制数据的类,提供了很多方法给开发者使用。其中,toJSON是一个将Buffer转成JSON对象的方法。在本文中,我会详细讲解toJSON方法的使用说明以及提供两个示例来帮助理解。 使用说明 语法 Buffer.toJSON() 返回值 返回一个JSON格式的对象,属性有type和data:- type:固定值 Bu…

    node js 2023年6月8日
    00
  • NodeJS后端开发操作文件之读写文件

    下面是NodeJS后端开发操作文件之读写文件的完整攻略: 1. 读取文件内容 读取文件的时候,我们可以利用NodeJS中的fs模块。fs模块是NodeJS自带的文件系统模块,通过该模块我们可以实现对文件的读写操作。 打开文件的步骤如下: const fs = require(‘fs’) //定义要读取的文件路径 const filePath = ‘./exa…

    node js 2023年6月8日
    00
  • KnockoutJS 3.X API 第四章之数据控制流foreach绑定

    KnockoutJS是一个JavaScript库,可以轻松地将数据绑定到HTML页面中。KnockoutJS的核心功能是数据绑定,而其中一个重要的数据绑定功能是“foreach”绑定。本文主要详细讲解KnockoutJS 3.X API 第四章之数据控制流foreach绑定的使用方法。 1. foreach绑定概述 “foreach”绑定可用于循环渲染一组数…

    node js 2023年6月8日
    00
  • NodeJS学习笔记之(Url,QueryString,Path)模块

    下面是关于“NodeJS学习笔记之(Url,QueryString,Path)模块”的完整攻略: 什么是Url,QueryString和Path? 在介绍Url,QueryString和Path模块之前,我们先来了解一下他们的概念: Url: 统一资源定位符,是指向互联网“资源”的指针。 QueryString: 查询字符串,是Url中问号后面的部分,包括多…

    node js 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部