(二)nodejs_Express

本文深入解析Express框架,涵盖其特点、安装、使用、动态路由、GET参数获取、EJS模板引擎、静态文件托管、中间件应用、Cookie与Session管理等核心功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1、Express

2、Express中间件

3、Cookie(不单独使,安全性比较低,一般通过express-session,设置cookie)

4、Session

 

Express 是一个基于 Node.js 平台,快速、开放、极简的 web 开发框架。
Express 框架是后台的 Node 框架,所以和 jQuery、zepto、yui、bootstrap 都不一个东西。
Express 特点:

1. Express 是一个基于 Node.js 平台的极简、灵活的 web 应用开发框架,它提供一系列强大的特性,帮助你创建各种 Web 和移动设备应用;

2. 丰富的 HTTP 快捷方法和任意排列组合的 Connect 中间件,让你创建健壮、友好的 API 变得既快速又简单;

3. Express 不对 Node.js 已有的特性进行二次抽象,我们只是在它之上扩展了 Web 应用所需的基本功。

1、Express

1、生成package.json:cnpm init    /     cnpm init --yes

2、安装:cnpm install express --save / npm install express --save

3、创建一个Express对象

      var Express = require('express');

      var app = new Express();  // 这里不用写new也可以

4、使用

app.get('/', (req, res) => { });

var express = require('express');

var app = new express();

app.get('/', (req, res) => {

    res.send('这是一个express的主页');

});

app.get('/login', (req, res) => {

    res.send('login');

});

app.get('/register', (req, res) => {

    res.send('register');

});

app.listen(8001);

5、动态路由:

var express = require('express');

var app = new express();

app.get('/newContent/:aid', (req, res) => {

    console.log(req.params);

    res.send('newContent:aid=' + req.params.aid);

});

app.listen(8001);

6、获取get传值:

var express = require('express');

var app = new express();

app.get('/newContent', (req, res) => {

    console.log(req.query);

    res.send('newContent:aid=' + req.query.aid + ';cid=' + req.query.cid);

});

app.listen(8001);

7、使用ejs模板(不需要引入ejs,安装即可,通过set引擎是ejs即可):

var express = require('express');

var app = express();

/**
 * 设置使用的类型模板引擎,
 * 不需要引入,因为express本身就支持了
 */
app.set('view engine', 'ejs');

/**
 * 指定路由的位置,
 * 这里指定是因为默认的项目是nodeTest1,而不是10 express_demo
 */
app.set('views', __dirname + '/views')

// 在index.ejs和new.ejs中,有引用外部组件header.ejs的方式

app.get('/', (req, res) => {

    // 不传参数,默认会在views下查找
    res.render('index');

});

app.get('/new', (req, res) => {

    var list = ['1111', '2222', '3333'];
    // 参数
    res.render('new', {
        list
    });

});

app.listen(8001);

8、静态文件托管:

var express = require('express');

var app = express();

app.set('view engine', 'ejs');
app.set('views', __dirname + '/views')

/**
 * 静态文件托管,其实就是引用中间件
 * 这里由于项目路径问题,带上外层目录:
 * http://localhost:8001/css/style.css
 */
app.use(express.static('10 express_demo/public'));

/**
 * 设置虚拟静态托管路径,实际上并不存在这个路径,而是根据虚拟路径,到express.static('10 express_demo/public')这个路径下去寻找
 * 实际上就是通过虚拟路径去访问静态文件:
 * http://localhost:8001/static/css/style.css
 */
app.use('/static', express.static('10 express_demo/public'));



// 现在,可以在ejs模板中,通过css/style.css或者static/css/style.css去访问静态文件了



app.get('/', (req, res) => {

    // 不传参数,默认会在views下查找
    res.render('index');

});

app.get('/news', (req, res) => {

    var list = ['1111', '2222', '3333'];
    // 参数
    res.render('news', {
        list
    });

});

app.listen(8001);
// 文件news.ejs


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="css/style.css">
</head>
<body>

    <!-- 引入外部ejs模板 -->
    <%- include public/header.ejs%>

    <h2>news</h2>

    <img src="images/baidu.gif" alt="百度">

    <ul>
        <% for (var i = 0; i < list.length; i++) { %>
            <li><%= list[i] %></li>
        <% } %>
    </ul>
</body>
</html>

2、Express中间件

中间件:就是在匹配路由之前和匹配路由之后执行的一系列操作,注意在某些中间件中,next()的使用

1、应用级中间件:匹配所有的路由,使用app.use

var express = require('express');
var app = express();

/**
 * 应用级中间件:匹配所有的路由
 *
 * next():表示继续往下走,因为路由匹配之后是不会继续往下走的
 */
app.use((req, res, next) => {

    console.log(new Date());

    next();

});


app.get('/', (req, res) => {

    res.send('first');

});

app.get('/news', (req, res) => {

    res.send('news');

});

app.listen(8001);

2、路由中间件


var express = require('express');
var app = express();


/**
 * 路由中间件:处理执行路由前的操作
 *
 * 比如:权限判断;在登录前判断,如果已登录则跳转已登录页面,未登录跳转未登录页面
 *
 *
 *
 * 1、通过app.use的方式实现路由中间件
 */
// app.use('/news', (req, res, next) => {
//
//     console.log('这是通过app.use的方式    实现的路由中间件');
//
//     next();
//
// });


app.get('/', (req, res) => {
    res.send('first');
});

/**
 * 2、通过app.get的方式,实现中间件,其实就是匹配到对应的路由,但是前面的路由不做res.send, 而是通过next()的方式,继续往下走
 */

app.get('/news', (req, res, next) => {
    console.log('是通过app.get的方式    实现的路由中间件');
    next();
});

app.get('/news', (req, res) => {

    res.send('news');

});


app.listen(8001);

3、错误处理中间件

var express = require('express');
var app = express();

app.get('/', (req, res) => {
    res.send('first');
});
app.get('/news', (req, res) => {
    res.send('news');
});

/**
 * 错误处理中间件,其实就是对错误进行处理
 */
app.use((req, res) => {

    res.status(404).send('page 404');

});

app.listen(8001);

4、内置中间件

var express = require('express');
var app = express();

/**
 * 内置中间件,比如静态托管
 */
app.use(express.static('11 express_中间件/public'));
/**
 * 设置虚拟目录的方式,静态托管
 */
app.use('/static', express.static('11 express_中间件/public'));

app.get('/', (req, res) => {
    res.send('first');
});
app.get('/news', (req, res) => {
    res.send('news');
});

app.listen(8001);

5、第三方中间件

/**
 * 第三方中间件(模块)是用的最多的
 *
 * 比如获取post提交的数据:安装body-parser
 *
 * 1、cnpm install body-parser --save
 *
 * 2、var bodyParser = require('body-parser');
 *
 * 4、app.use(bodyParser.urlencoded({ extended: false }));
 *    app.use(bodyParser.json());
 *
 * 5、获取post数据:req.body
 *
 */

var express = require('express');
var app = express();

// 设置模板引擎
app.set('view engine', 'ejs');
// 指定模板引擎的目录
app.set('views', __dirname + '/views');

// 使用第三方中间件:body-parser
var bodyParser = require('body-parser');
// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: false }));
// parse application/json
app.use(bodyParser.json());


app.get('/login', (req, res) => {
    // login.ejs是一个登录页面,form表单的action="/dologin"
    res.render('login');

});
app.post('/dologin', (req, res) => {
    console.log(req.body);
    res.send('登录成功!');
});

app.listen(8001);

 

3、Cookie(不单独使,安全性比较低,一般通过express-session,设置cookie)

使用第三方中间件:cookie-parser

1、cnpm install cookie-parser --save

2、var cookieParser = require('cookieParser');

3、app.use(cookieParser());

4、使用:res.cookie(name, value, configure)

      // 参数1:cookie名称

      // 参数2:cookie的值

      // 参数3:cookie的配置信息

     

var express = require('express');
var app = express();

var cookieParser = require('cookie-parser');


app.use(cookieParser());

/**
 * 这里需要注意的是,
 * 通过:res.cookie()设置cookie,
 * 通过:req.cookies获取cookie
 */

app.get('/', (req, res) => {
    console.log(req.cookies);
    res.send('first');
});

app.get('/news', (req, res) => {
    console.log(req.cookies);
    res.send('news');
});

app.get('/set', (req, res) => {

    // 参数1:cookie名称
    // 参数2:cookie的值
    // 参数3:cookie的配置信息
    res.cookie('username', 'cookie的值', {maxAge: 600 * 1000});

    res.send('设置cookie成功');

});


app.listen(8001);

一个小知识点,给本机设置默认的域名地址访问方式。打开C:\Windows\System32\drivers\etc\hosts文件中,最后添加:

127.0.0.1   www.aaa.com

127.0.0.1   news.aaa.com

这样,本地默认访问的方式127.0.0.1/localhost可以,变成访问www.aaa.com或者news.aaa.com,便于测试哈哈(有点鸡肋)。

 

cookie指定域名可以访问到

var express = require('express');
var app = express();

var cookieParser = require('cookie-parser');

app.use(cookieParser());


/**
 * 设置cookie的配置信息,
 * maxAge:
 *      cookie的过期时间
 *
 * httpOnly:
 *      表示cookie只能在服务端修改,而不能通过客户端js修改
 *
 * domain作用:
 *      让多个二级域名下共享cookie,而其他的域名或者ip则访问不到,例如:
 *          模拟域名:在C:\Windows\System32\drivers\etc\hosts文件中,最后添加
 *                      127.0.0.1   www.aaa.com
 *                      127.0.0.1   news.aaa.com
 *          这样就绑定了两个二级域名到本地,而domain则设置成".aaa.com"即可
 *          这样,通过www.aaa.com:8001和www.aaa.com:8001/news就都可以访问到cookie了
 *
 *
 *  path作用:
 *      让cookie在指定路由下才能被访问,例如path: '/news',
 *      这样,只有www.aaa.com:8001/news可以访问到cookie,而www.aaa.com:8001访问不到
 *
 */

app.get('/', (req, res) => {
    console.log(req.cookies);
    res.send('first');
});

app.get('/news', (req, res) => {
    console.log(req.cookies);
    res.send('news');
});

app.get('/set', (req, res) => {

    // 参数1:cookie名称
    // 参数2:cookie的值
    // 参数3:cookie的配置信息
    res.cookie('username', 'cookie的值', {maxAge: 600 * 1000, domain: '.aaa.com', httpOnly: true, path: '/news'});

    res.send('设置cookie成功');

});


app.listen(8001);

cookie的加密属性

var express = require('express');
var app = express();

var cookieParser = require('cookie-parser');

/**
 * 设置cookie的配置信息
 *
 * 加密cookie,signed:
 *      默认cookie是明文的,通过设置signed:true,可以自动给cookie加密,用法:
 *      1、设置随机加密字符串:app.use(cookieParser('sign'));
 *      2、设置cookie配置属性:signed:true;
 *      3、获取:req.signedCookies;
 *
 */


app.use(cookieParser('sign'));

app.get('/', (req, res) => {
    // 获取明文的cookies
    // console.log(req.cookies);
    // 获取有加密的cookies
    console.log(req.signedCookies);
    res.send('first');
});

app.get('/news', (req, res) => {
    // 获取明文的cookies
    // console.log(req.cookies);
    // 获取有加密的cookies
    console.log(req.signedCookies);
    res.send('news');
});

app.get('/set', (req, res) => {

    // 参数1:cookie名称
    // 参数2:cookie的值
    // 参数3:cookie的配置信息
    res.cookie('username', 'cookie的值', {maxAge: 600 * 1000, signed: true});

    res.send('设置cookie成功');

});


app.listen(8001);

 

4、Session

一个简单的登录例子

/**
 * Session其实就是一个键值对,通过在服务端生成一个键值对(key-value),
 * 将key返回给客户端cookie,而客户端通过key,请求服务器拿到value。
 *
 *
 * 1、安装express-session:
 *      cnpm install express-session --save
 *
 * 2、引用:
 *      var session = require('express-session');
 *
 * 3、设置中间件:
 *      app.use(session({
 *
 *      }));
 *
 * 4、使用:
 *      设置session:req.session.userinfo = '张三';
 *
 *      获取req.session.userinfo
 */


var express = require('express');
var app = express();

var session = require('express-session');

app.use(session({
    secret: 'this is string key', // 设置随机加密字符串
    name: 'session_id', // 保存在本地cookie的名称,默认是connect_sid
    resave: false,  // 强制保存session,及时它没有初始化,默认为true,建议设置成false
    saveUninitialized: true, // 强制将为初始化的session存储,默认是true, 建议是true,此时也会生成一个session
    // cookie: { secure: true }, // secure是设置访问cookie的权限,true设置https,false设置http,这里的cookie和前面设置cookie的配置信息一致
    cookie: {
        maxAge: 5 * 1000
    },
    rolling: true, // 设置如果用户一直访问,则强制重新设置cookie,此时会重置maxAge,默认false,false下,无论用户是否访问,maxAge的时间一到,cookie、session就销毁
}));

app.get('/', (req, res) => {

    if (req.session.userInfo) {
        res.send('账号:' + req.session.userInfo + ',欢迎回来。');
    } else {
        res.send('未登录');
    }

});

app.get('/login', (req, res) => {

    // 如果直接req.session; 表示没有初始化session
    req.session.userInfo = '张三1111';
    res.send('登录成功');

});


app.listen(8001);

退出登录时,销毁session

app.get('/loginOut', (req, res) => {

    // 常用的设置session失效的方式
    // 1、设置cookie的maxAge=0
    // req.session.cookie.maxAge = 0;


    // 2、通过session的destroy方法销毁session
    req.session.destroy(err => {
        console.log(err);
    });

    res.send('退出登录成功');

});

自动保存session到MongoDB数据库,访问http://127.0.0.1:8001/login,登录之后,会在数据库中生成一个sessions集合,示例代码和数据库如下:

/**
 * 1、安装 express-session和connect-mongo
 *
 * 2、引入express-session和connect-mongo
 *      var session = require('express-session');
 *      var MongoStore = require('connect-mongo')(session);
 *
 * 3、配置session的store属性
 *      app.use(session({
 *              // ... 其他的属性
 *              store: new MongoStore({
                    url: 'mongodb://127.0.0.1:27017/shop',
                    touchAfter: 24 * 3600 // 在不改变session的情况下,24小时才刷新一次到数据库
                })
        }));

   4、重启服务器,登录之后,数据库会自动生成sessions集合,并且插入数据
        db.sessions.find()
 */


var express = require('express');
var app = express();

var session = require('express-session');

var MongoStore = require('connect-mongo')(session);

app.use(session({
    secret: 'this is string key', // 设置随机加密字符串
    name: 'session_id', // 保存在本地cookie的名称,默认是connect_sid
    resave: false,  // 强制保存session,及时它没有初始化,默认为true,建议设置成false
    saveUninitialized: true, // 强制将为初始化的session存储,默认是true, 建议是true,此时也会生成一个session
    // cookie: { secure: true }, // secure是设置访问cookie的权限,true设置https,false设置http,这里的cookie和前面设置cookie的配置信息一致
    cookie: {
        maxAge: 30 * 60 * 1000
    },
    rolling: true, // 设置如果用户一直访问,则强制重新设置cookie,此时会重置maxAge,默认false,false下,无论用户是否访问,maxAge的时间一到,cookie、session就销毁
    store: new MongoStore({ // 访问之后会自动在login数据中自动创建sessions集合并插入数据
        url: 'mongodb://127.0.0.1:27017/login',
        touchAfter: 24 * 3600
    })
}));

app.get('/', (req, res) => {

    if (req.session.userInfo) {
        res.send('账号:' + req.session.userInfo + ',欢迎回来。');
    } else {
        res.send('未登录');
    }

});

app.get('/login', (req, res) => {

    // 如果直接req.session; 表示没有初始化session
    req.session.userInfo = '张三1111';
    res.send('登录成功');

});

app.get('/loginOut', (req, res) => {

    // 常用的设置session失效的方式
    // 1、设置cookie的maxAge=0
    // req.session.cookie.maxAge = 0;


    // 2、通过session的destroy方法销毁session
    req.session.destroy(err => {
        console.log(err);
    });

    res.send('退出登录成功');

});


app.listen(8001);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

rising_chain

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值