Node.js利用Express实现用户注册登陆功能(推荐)

对于“Node.js利用Express实现用户注册登陆功能(推荐)”这个主题,我有如下的详细讲解和完整攻略。

1. 准备工作

在开始进行用户注册登陆功能的实现前,需要确保已经安装好了Node.js和Express框架。

2. 创建项目目录和文件

在命令行中,使用如下命令创建项目目录:

mkdir node-login

进入该目录,使用如下命令创建项目文件:

touch app.js routes/index.js routes/user.js views/index.ejs views/login.ejs views/register.ejs

其中,app.js是项目的入口文件,index.js和user.js是路由文件,index.ejs、login.ejs和register.ejs是视图模板文件。

3. 设置依赖

在项目目录下,使用如下命令设置所需的依赖:

npm install express body-parser cookie-parser express-session mongoose connect-mongo --save

这里进行了如下设置:

  • express:Express框架;
  • body-parser:解析POST请求的中间件;
  • cookie-parser:解析Cookie的中间件;
  • express-session:会话管理中间件;
  • mongoose:MongoDB的ODM框架;
  • connect-mongo:将会话存储在MongoDB中的模块。

4. 编写代码

接下来,我们需要进行代码的编写。

首先来看一下app.js的代码:

var express = require('express');
var bodyParser = require('body-parser');
var cookieParser = require('cookie-parser');
var session = require('express-session');
var mongoose = require('mongoose');
var MongoStore = require('connect-mongo')(session);

var app = express();

mongoose.Promise = global.Promise;
mongoose.connect('mongodb://localhost/node-login');

app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(session({
    secret: 'node-login',
    resave: true,
    saveUninitialized: false,
    cookie: {
        maxAge: 60000
    },
    store: new MongoStore({
        mongooseConnection: mongoose.connection
    })
}));

app.use('/', require('./routes/index'));
app.use('/user', require('./routes/user'));

app.listen(3000, function() {
    console.log('Server running at http://localhost:3000/');
});

这里首先引入了所需的依赖,然后设置了MongoDB连接,接着使用了body-parser、cookie-parser和session中间件,并将session存储在MongoDB中,最后设置了路由和监听端口。

然后是index.js的代码:

var express = require('express');
var router = express.Router();

router.get('/', function(req, res, next) {
    res.render('index', {
        title: 'Node.js Login Tutorial'
    });
});

module.exports = router;

这里设置了根路由,并渲染了index视图模板文件。

接下来是user.js的代码:

var express = require('express');
var router = express.Router();
var UserModel = require('../models/user');

router.get('/register', function(req, res, next) {
    res.render('register', {
        title: 'Register'
    });
});

router.post('/register', function(req, res, next) {
    var user = new UserModel({
        username: req.body.username,
        password: req.body.password
    });
    user.save(function(err, user) {
        if(err) {
            return next(err);
        }
        req.session.user = user._id;
        res.redirect('/user/profile');
    });
});

router.get('/login', function(req, res, next) {
    res.render('login', {
        title: 'Login'
    });
});

router.post('/login', function(req, res, next) {
    UserModel.findOne({ username: req.body.username }, function(err, user) {
        if(err) {
            return next(err);
        }
        if(!user || user.password !== req.body.password) {
            return res.redirect('/user/login');
        }
        req.session.user = user._id;
        res.redirect('/user/profile');
    });
});

router.get('/profile', function(req, res, next) {
    if(!req.session.user) {
        return res.redirect('/user/login');
    }
    UserModel.findById(req.session.user, function(err, user) {
        if(err) {
            return next(err);
        }
        if(!user) {
            return res.redirect('/user/login');
        }
        res.render('profile', {
            title: 'Profile',
            user: user
        });
    });
});

router.get('/logout', function(req, res, next) {
    req.session.destroy();
    res.redirect('/');
});

module.exports = router;

这里设置了/register、/login、/profile和/logout四个路由,分别用于用户注册、用户登陆、用户资料页面和用户退出登录。其中,使用了UserModel模型来进行用户的存储和查询。

最后是视图模板文件。以login.ejs为例:

<!DOCTYPE html>
<html>
    <head>
        <title><%= title %></title>
    </head>
    <body>
        <h1><%= title %></h1>
        <% if (message) { %>
            <p><%= message %></p>
        <% } %>
        <form method="post" action="/user/login">
            <p>
                <label>Username:</label>
                <input type="text" name="username" required>
            </p>
            <p>
                <label>Password:</label>
                <input type="password" name="password" required>
            </p>
            <p>
                <button type="submit">Login</button>
            </p>
        </form>
    </body>
</html>

这里使用了EJS模板引擎,设置了用户名、密码的输入框和登陆按钮。

5. 运行项目

最后,使用如下命令运行项目:

node app.js

然后在浏览器中访问http://localhost:3000/,即可看到项目的主页。在该主页中,可以选择注册或者登陆。如果成功登陆,可以看到用户的资料页面。在该页面中,可以选择退出登陆。

以上是利用Express实现用户注册登陆功能的完整攻略。如果需要,还可以添加验证码、邮箱激活等其他功能。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Node.js利用Express实现用户注册登陆功能(推荐) - Python技术站

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

相关文章

  • C#中使用Spire.doc对word的操作方式

    下面我就来为您详细讲解一下C#中使用Spire.doc对Word的操作方式。 什么是Spire.doc? Spire.doc for .NET 是一款专业的Word文档操作组件,它可以帮助开发者实现对Word文件的创建、读取、编辑、转换及打印等操作,而且具有很好的性能和稳定性。 Spire.doc的安装 首先,我们需要在官网下载Spire.Doc for .…

    C# 2023年6月1日
    00
  • 使用 BenchmarkDotNet 对 C# 代码进行基准测试

    以下是使用 BenchmarkDotNet 对 C# 代码进行基准测试的完整攻略。 什么是 BenchmarkDotNet? BenchmarkDotNet 是一个用于 .NET 应用程序的基准测试框架。它允许你轻松地编写、运行和分析基准测试代码,以衡量代码性能和稳定性,从而帮助你做出优化决策。 如何使用 BenchmarkDotNet 进行基准测试? 首先…

    C# 2023年6月3日
    00
  • WinForm中comboBox控件数据绑定实现方法

    WinForm中的comboBox控件是一种常用的下拉选择框控件,可以让用户从预设的选项中选择一项或输入自定义内容。下面将详细介绍如何实现comboBox控件的数据绑定。 1. 绑定数据源 首先,需要将comboBox控件绑定到需要显示的数据源。可以通过WinForm设计器中的属性窗口完成这个操作。步骤如下: 步骤1:打开WinForm设计器 在Visual…

    C# 2023年6月7日
    00
  • 在c#中使用servicestackredis操作redis的实例代码

    在C#中使用ServiceStack.Redis操作Redis的实例代码,需要按照以下步骤进行: 引入ServiceStack.Redis包 使用NuGet包管理器,搜索并下载ServiceStack.Redis包,或者使用命令行工具安装:Install-Package ServiceStack.Redis 创建RedisManagerPool 在需要使用r…

    C# 2023年5月31日
    00
  • C#中把DataTable、Dataset转Json数据

    转化 DataTable 或者 Dataset 为 Json 数据可以借助于第三方库,比如 Newtonsoft.Json 库。以下是具体的示例攻略: 1. 使用 Newtonsoft.Json 转换单个 DataTable 在 Visual Studio 等 IDE 中,在项目中添加 Newtonsoft.Json 库,或者通过 NuGet 安装 给 Da…

    C# 2023年5月31日
    00
  • C#实现的UDP收发请求工具类实例

    下面为您详细讲解如何实现“C#实现的UDP收发请求工具类实例”。 什么是UDP? UDP是一种无连接的传输协议,它不保证数据传输的可靠性,但是在实时传输和流媒体等领域得到了广泛应用。通过UDP传输数据时,数据包不可靠地从源端发送到目的地,不会进行确认、重传和拥塞控制等。 C#中的UDP实现 C#中提供了Socket类,可以用于创建UDP套接字和进行数据的收发…

    C# 2023年6月6日
    00
  • C#中dynamic关键字的正确用法(推荐)

    下面是“C#中dynamic关键字的正确用法(推荐)”的详细攻略: 什么是dynamic关键字 C#中的dynamic关键字,是用于在运行时(而非编译时)进行类型检查和绑定,它可以让我们代码更加灵活、简洁、易读。 C#中的dynamic和var关键字的区别在于,var关键字是在编译时进行类型判断并声明变量类型,在编译后变量类型就确定了,而dynamic关键字…

    C# 2023年5月15日
    00
  • REST架构及RESTful应用程序简介

    REST架构及RESTful应用程序简介 REST(Representational State Transfer)是一种基于HTTP协议的Web服务架构。RESTful应用程序是符合REST架构的应用程序。本文将介绍REST架构及RESTful应用程序的基本概念和实现方法。 REST架构的基本概念 REST架构的基本概念包括资源、URI、HTTP方法和状态…

    C# 2023年5月15日
    00
合作推广
合作推广
分享本页
返回顶部