node.js实现登录注册页面

yizhihongxing

下面是详细讲解“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日

相关文章

  • 全面解析Node.js 8 重要功能和修复

    全面解析Node.js 8 重要功能和修复 Node.js 8 是一个非常重要的版本,它带来了一些重要的新功能和修复了很多已知的问题,本文将深入分析这些内容。在阅读该攻略前,你需要了解 Node.js 基础知识和一些常见的编程概念。 Async Hooks Async Hooks 是Node.js 8中的新功能之一,它提供了一种在 Node.js 应用程序中…

    node js 2023年6月7日
    00
  • js使用ajax传值给后台,后台返回字符串处理方法

    下面是关于“js使用ajax传值给后台,后台返回字符串处理方法”的完整攻略: 1. 前端使用ajax传值给后台 使用ajax可以通过异步的方式向后台发送数据请求。在前端代码中,可以使用jQuery库提供的$.ajax()函数快速实现。 具体步骤如下: 在HTML文件中引入jQuery库: “`html “` 编写ajax请求: javascript $.…

    node js 2023年6月8日
    00
  • golang、python、php、c++、c、java、Nodejs性能对比

    Golang、Python、PHP、C++、C、Java、Node.js性能对比 在选择一种编程语言时,性能通常是衡量其优缺点的重要标准之一。在本文中,我们将比较Golang、Python、PHP、C++、C、Java和Node.js的性能。我们将以以下方式进行比较: 编写测试脚本,测试各种语言的运行时间; 对各种语言的内存消耗进行比较; 观察并解释运行脚本…

    node js 2023年6月8日
    00
  • 使用node.JS中的url模块解析URL信息

    使用node.js中的url模块可以方便地解析URL信息,以下是解析URL信息的完整攻略: 引入url模块 要使用url模块,首先需要在代码中引入该模块,可以使用require函数来实现: const url = require(‘url’); 使用url.parse()方法解析URL url模块提供了url.parse()方法,该方法可以接收一个URL字符…

    node js 2023年6月8日
    00
  • ajax +NodeJS 实现图片上传实例

    下面是“ajax +NodeJS 实现图片上传实例”的完整攻略。 前提条件 前端使用jQuery库 后端使用NodeJS和express框架 需要安装multer中间件处理文件上传 实现过程 1. 前端页面 在前端页面中,需要准备一个表单,其中包含一个input[type=file]元素,用于选择要上传的图片。此外,还需要添加一个button,用于提交表单数…

    node js 2023年6月8日
    00
  • node.js使用express-fileupload中间件实现文件上传

    使用 Express 和 Express-fileupload 中间件可以轻松实现基于 Node.js 的文件上传功能。下面是一个详细的攻略。 使用Express-fileupload中间件实现文件上传 步骤一:安装Express和Express-fileupload 在开始使用Express-fileupload中间件之前,需要安装 Express 框架和…

    node js 2023年6月8日
    00
  • nodejs开发——express路由与中间件

    下面是关于 “Node.js 开发——Express 路由与中间件” 的完整攻略。 什么是 Express? Express 是一个基于 Node.js 平台的 Web 应用开发框架,提供了一系列强大的特性,如路由控制、中间件、模板引擎等,可以让开发者高效地构建功能丰富、易于扩展的 Web 应用。 路由 在 Express 中,路由是指根据 HTTP 请求的…

    node js 2023年6月8日
    00
  • node+axios实现服务端文件上传示例

    下面是针对使用node和axios实现服务端文件上传的完整攻略。 1. 安装依赖 在开始代码实现之前,需要先安装一些必要的依赖包。这里我们需要下载express、body-parser和multer这三个包。其中,express用来搭建服务器,body-parser用于解析POST请求中的body,multer用于处理文件上传。 npm install ex…

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