路由器 express.Router

路由器 模块化管理 路由

  • 基本使用:
  • 路由模块

1. 引入 express

const express = require('express');

其他相关模块

const sha1 = require('sha1');

const tableModel= require('models');

const {resolve} = require(path);

2. 创建路由器对象

const router = new express.Router();

3. 写 router.post() 或者 router.get()

4. 暴露本模块的路由

module.exports = router;

  • index.js 主模块使用 app.use(中间件) 使用

1. 引入路由器模块

const uiRouter = require('./routers/uiRouter');

const userRouter = require('./routers/userRouter');

2. 应用路由器

app.use(uiRouter);

app.use(userRouter);

  • 源代码实例(登录/注册)

package.json

  • {
    "name": "node_express",
    "version": "1.0.0",
    "main": "index.js",
    "license": "MIT",
    "dependencies": {
    "express": "^4.16.4",
    "mongoose": "^5.4.0"
    }
    }

templates/login.html

  • <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8"/>
    <title>用户登录</title> <link rel="stylesheet" type="text/css" href="css/index.css"/>
    </head> <body>
    <div id="outer_box" class="login">
    <h2>用户登录</h2>
    <form action="http://localhost:3000/login" method="post">
    <div class="clothes">
    <label for="input_name">用&nbsp;户&nbsp;名</label>
    <input id="input_name" type="text" name="user_name" placeholder="请输入用户名" />
    </div> <div class="clothes">
    <label for="input_pwd">密&nbsp;&nbsp;&nbsp;码</label>
    <input id="input_pwd" type="password" name="user_pwd" placeholder="请输入密码" />
    </div> <div class="clothes">
    <a class="btn" href="http://localhost:3000/register">
    <button type="button">注册</button>
    </a>
    <button class="login btn" type="submit">登录</button>
    </div>
    </form>
    </div>
    </body>
    </html>

templates/register.html

  • <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8"/>
    <title>用户注册</title> <link rel="stylesheet" type="text/css" href="css/index.css"/>
    </head> <body>
    <div id="outer_box" class="register">
    <h2>用户注册</h2>
    <form action="http://localhost:3000/register" method="post">
    <div class="clothes">
    <label for="input_name">用&nbsp;户&nbsp;名</label>
    <input id="input_name" type="text" name="user_name" placeholder="请输入用户名" />
    </div> <div class="clothes">
    <label for="input_pwd">密&nbsp;&nbsp;&nbsp;码</label>
    <input id="input_pwd" type="password" name="user_pwd" placeholder="请输入密码" />
    </div> <div class="clothes">
    <label for="input_repeat_pwd">确认密码</label>
    <input id="input_repeat_pwd" type="password" name="user_repeat_pwd" placeholder="请再次输入密码" />
    </div> <div class="clothes">
    <label for="input_email">注册邮箱</label>
    <input id="input_email" type="text" name="user_email" placeholder="请输入邮箱地址" />
    </div> <div class="clothes">
    <button class="register btn" type="submit">注册</button>
    <a class="btn" href="http://localhost:3000/login">
    <button type="button">登录</button>
    </a>
    </div>
    </form>
    </div>
    </body>
    </html>

templates/css/index.css

  • body {
    width: 100%;
    height: 100%; color: #000;
    background: #b9c2a4;
    background-size: cover; /* 指定背景图片大小 */
    } /*************************************************/
    #outer_box {
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    color: #1a45c3;
    } #outer_box.login {
    color: #9e098b;
    } #outer_box.register {
    color: #1a45c3;
    } #outer_box>h2{
    padding-bottom: 40px;
    margin-left: -50px;
    } .clothes {
    width: 260px;
    display: flex;
    justify-content: space-between;
    margin: 20px 0;
    font-size: 18px;
    line-height: 32px;
    } .clothes>label{
    width: 80px;
    text-align: center;
    } .clothes>input{
    width: 170px;
    height: 32px;
    } button {
    width: 100%;
    height: 100%; font-size: 16px;
    background-color: #c4ceda;
    cursor: pointer;
    } .clothes .btn{
    width: 64px;
    height: 32px;
    margin: 0 20px;
    } .clothes button.register{
    background-color: #1a45c3;
    color: #fff;
    } .clothes button.login{
    background-color: #9e098b;
    color: #fff;
    }

routers/get/index_router.js

  • const express = require('express');
    const {resolve} = require('path'); const indexRouter = new express.Router(); /************************ get ***********************/
    indexRouter.get('/', (request, response)=>{
    response.sendFile(resolve(__dirname, '../../templates/login.html'));
    }); indexRouter.get('/login', (request, response)=>{
    response.sendFile(resolve(__dirname, '../../templates/login.html'));
    }); indexRouter.get('/register', (request, response)=>{
    response.sendFile(resolve(__dirname, '../../templates/register.html'));
    }); module.exports = indexRouter;

routers/post/form_router.js

  • const express =  require('express');
    const sha1 = require('sha1'); const promiseConnect = require('../../db/connectDB.js');
    const userInfoModel = require('../../models/userModel.js'); const formRouter = new express.Router(); /************************ post ***********************/
    let logged = false ;
    promiseConnect.then(async result=>{
    console.log(result); formRouter.post('/register', async (request, response)=>{
    const {
    user_name:uName,
    user_pwd:uPwd,
    user_repeat_pwd:urePwd,
    user_email:uEmail,
    } = request.body; /**** 解构赋值 ****/ userInfo = {
    "userName": uName,
    "userPassword": uPwd,
    "userEmail": uEmail
    }; let errInfo = {}; if(urePwd !== uPwd){
    errInfo.repeatPassword = '两次输入不一致';
    };
    if(!(/^[a-zA-Z][a-zA-Z0-9_]{5,20}$/.test(uName))){
    errInfo.name = '用户名不合法';
    };
    if(!(/^[a-zA-Z0-9_]{6,20}$/.test(uPwd))){
    errInfo.password = '密码不合法';
    };
    if(!(/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/.test(uEmail))){
    errInfo.email = '邮箱不合法';
    }; const badEmail = await userInfoModel.findOne({"userEmail": uEmail});
    if(badEmail){
    errInfo.emailRegistered = '邮箱已被注册';
    }; if(errInfo.repeatPassword || errInfo.name || errInfo.password || errInfo.email){
    response.send(errInfo);
    return;
    }; const fond = await userInfoModel.findOne({"userName": uName});
    if(fond){
    response.send({"error":'用户名已被注册'});
    }else{
    userInfo.userPassword = sha1(userInfo.userPassword);
    await userInfoModel.create(userInfo);
    response.redirect('/login'); // http://localhost:3000/login
    };
    }); formRouter.post('/login',async (request, response)=>{
    logged = false;
    let uName = request.body['user_name'];
    let uPwd = request.body['user_pwd'];
    userInfo = {
    "userName": uName,
    "userPassword": uPwd
    }; if(!(/^[a-zA-Z][a-zA-Z0-9_]{5,20}$/.test(uName))){
    logged = false; // 用户名不存在
    }else if(!(/^[a-zA-Z0-9_]{6,20}$/.test(uPwd))){
    logged = false; // 密码错误
    }; const findName = await userInfoModel.findOne({"userName": uName});
    const findPwd = await userInfoModel.findOne({"userPassword": sha1(uPwd)});
    if(findName && findPwd){
    logged = true;
    }; response.send(logged?{"success":'登录成功'}:{"error":'用户名或密码错误'});
    });
    }).catch(err=>console.log(err)); module.exports = formRouter;

db/connectDB.js

  • const mongoose = require('mongoose');
    
    module.exports = new Promise((resolve, reject)=>{
    mongoose.connect('mongodb://localhost:27017/user_database', {useNewUrlParser:true})
    mongoose.connection.once('open', err=>{
    if(err){
    console.log(err);
    reject(err);
    }else{
    resolve('数据库已连接');
    };
    });
    });

models/userModel.js

  • const mongoose = require('mongoose');
    
    const Schema = mongoose.Schema;
    const fieldSchema = new Schema({
    "userName": {
    "type": String,
    "unique": true,
    "required": true
    },
    "userPassword": {
    "type": String,
    "required": true
    },
    "userEmail": {
    "type": String,
    "unique": true,
    "required": true
    },
    "createTime": {
    "type": Date,
    "default": Date.now()
    }
    }); module.exports = mongoose.model("user_info", fieldSchema);

index.js

  • const express =  require('express');
    
    const app = express();
    
    const indexRouter = require('./routers/get/index_router.js');
    const formRouter = require('./routers/post/form_router.js'); /*********************** 中间件 **********************/
    // 暴露路由 login.html register.html
    app.use(express.static('templates')); // 默认调用 next(); // 将 用户输入的数据 挂载到 请求体 request.body 上
    app.use(express.urlencoded({extended: true})); // 默认调用 next(); app.use(indexRouter);
    app.use(formRouter); /**************** 端口号 3000, 启动服务器 ***************/
    app.listen(3000, err=>console.log(err?err:'\n\n服务器已启动: http://localhost:3000\nHunting Happy!'));

Node.js_ express.Router 路由器_模块化管理路由的更多相关文章

  1. node.js+express+jade系列二:rotue路由的配置

    页面的访问最常见的是get和post两种,无论是get请求还是post请求express自动判断执行app.get或app.post 1:app.get(名称,路径)或app["get&qu ...

  2. Node.js使用Express.Router

    在实际开发中通常有几十甚至上百的路由,都写在 index.js 既臃肿又不好维护,这时可以使用 express.Router 实现更优雅的路由解决方案. 目录结构如下: routes的index.js ...

  3. Node.js + Express 接口请求(GET、POST、PUT)事例

    路由 路由是指应用程序的端点(URI)如何响应客户端请求.有关路由的介绍,请参阅基本路由. 您可以使用Express app对象的方法定义路由,这些方法对应于HTTP方法; 例如,app.get()处 ...

  4. express.Router

    [express.Router] 1.可使用 express.Router 类创建模块化.可挂载的路由句柄.Router 实例是一个完整的中间件和路由系统,因此常称其为一个 “mini-app”. 下 ...

  5. express 学习笔记(一)路由

    先导入express: var express = require('express'); var app = express(); 1.路由方法: get, post, put, head, del ...

  6. express.Router创建模块化路由

    使用 app.route() 创建路由路径的链式路由句柄.由于路径在一个地方指定,这样做有助于创建模块化的路由,而且减少了代码冗余和拼写错误. 先放小实例: app.js var express = ...

  7. Node 之 Express 学习笔记 第二篇 Express 4x 骨架详解

    周末,没事就来公司加班继续研究一下Express ,这也许也是单身狗的生活吧. 1.目录结构: bin, 存放启动项目的脚本文件 node_modules, 项目所有依赖的库,以及存放 package ...

  8. node+pm2+express+mysql+sequelize来搭建网站和写接口

    前面的话:在这里已经提到了安装node的方法,node是自带npm的.我在技术中会用es6去编写,然后下面会分别介绍node.pm2.express.mysql.sequelize.有少部分是摘抄大佬 ...

  9. Node 之 Express 4x 骨架详解

    周末,没事就来公司加班继续研究一下Express ,这也许也是单身狗的生活吧. 1.目录结构: bin, 存放启动项目的脚本文件 node_modules, 项目所有依赖的库,以及存放 package ...

随机推荐

  1. DirectX11 With Windows SDK--06 DirectXMath数学库

    前言 xnamath.h原本是位于DirectX SDK的一个数学库,但是现在Windows SDK包含的数学库已经抛弃掉原来的xnamath.h,并演变成了现在的DirectXMath.h.其实本质 ...

  2. 第二节:比较DateTime和DateTimeOffset两种时间类型并介绍Quartz.Net中用到的几类时间形式(定点、四舍五入、倍数、递增)

    一. 时间的类型 1. 背景 这里为什么要介绍时间类型呢,明明是定时调度篇,原因是在定时任务中,任务什么时间开始执行,什么时间结束执行,要用到各种各样的时间模式,虽然这不能算是一个复杂的问题,但在正式 ...

  3. VIM --使用进阶 -- 插件篇 -- YouCompleteMe -- nerdtree

    系统:ubuntu: 资源:https://github.com/ 其他:想了解都要哪些好用的插件,推荐大家读 http://blog.csdn.net/mergerly/article/detail ...

  4. auto类型说明符

    auto让编译器通过出初始值来推算变量的类型,显然,auto定义的变量必须有初始值: //由val1和val2相加的结果可以推断出item的类型 auto item = val1 + val2;//i ...

  5. 设计模式二: 工厂方法(Factory Method)

    简介 工厂方法模式是创建型模式的一种, 核心结构有四个角色: 抽象工厂,具体工厂,抽象产品,具体产品; 实现层面上,该模式定义一个创建产品的接口,将实际创建工作推迟到具体工厂类实现, 一个产品对应一个 ...

  6. JSP标签和JSTL

    Java的5个标签库:核心(c).格式化(fmt).函数(fn).SQL(sql).XML(x) SQL.XML库不推荐使用 核心标签库(c) //taglib指令 <%@ taglib pre ...

  7. LeetCode 第五题 最长的回文字符串 (JAVA)

    Longest Palindromic Substring 简介:字符串中最长的回文字符串 回文字符串:中心对称的字符串 ,如 mom,noon 问题详解: 给定一个字符串s,寻找字符串中最长的回文字 ...

  8. 关于TabLayout与ViewPager在Fragment中嵌套Fragment使用或配合使用的思考

    注意: 因为继承的是Fragment,所以getSupportFragmentManager()与getFragmentManager()方法无法使用,这里需要用到getChildFragmentMa ...

  9. Linux的错误码表

    Linux的错误码表(errno table): _ 124 EMEDIUMTYPE_ Wrong medium type_ 123 ENOMEDIUM__ No medium found_ 122 ...

  10. Python-Django基础

    django目录 -settings -urls -views ******强调:setting中'django.middleware.csrf.CsrfViewMiddleware'中间件先注释掉 ...