~ Node.js 第三方中间件

cookie-parser

用于解析 cookie,添加后,req 就具备了 cookie 属性,可以使用 req.cookie.xxx 访问

cookieParser(secret,options)
说明:secret,可选,处于安全性考虑,用于对cookie进行签名,通过它可以判断客户是否修改了cookie,这个参数是任意字符串
options,可选,它是一个json对象,可选项包括:path、expires、maxAge、domain、secure、httpOnly
# 安装 node 模块
  npm install cookie-parser

# 代码示例

  const express = require('express');
  const app = express();
  // 导入 cookie-parser
  const cookieParser = require('cookie-parser');
  app.use(cookieParser());

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

  app.listen(3000,()=>{
	  console.log('app is running');
  });

express-session

session 运行在服务器端,当客户端第一次访问服务器时,可以将客户的登录信息保存。 当客户访问其他页面时,可以判断客户的登录状态,做出提示,相当于登录拦截。session 可以和 Redis 或者数据库等结合做持久化操作,当服务器挂掉时也不会导致某些客户信息(购物车)丢失。

# 安装
  npm install express-session

# 基本语法
  var express = require('express')
  var session = require('express-session')
  var app = express()
  app.use(session(options))

  // options 常用选项
    (1)name - 默认 'connect.sid',可自定义
    (2)secret - 用于对 cookie 进行签名 ,通过它可以判断出客户是否修改了 cookie,这是处于安全考虑,这个参数是任意字符串
    (3)cookie - 对 session cookie 的设置 。默认值 { path: '/', httpOnly: true, secure: false, maxAge: null }
    (4)genid -  是个函数,调用它来生成一个新的会话 ID。 (默认:使用 UID2 库)
    (5)rolling -  强制对每个响应的 Cookie,重置到期日期。 (默认:false)
    (6)resave - 每一次都重新保存,即使没修改过(默认:true)
    (7)proxy - ture/false,是否支持trust proxy,,需要设置 app.enable('trust proxy');一般来说,无需设置

  // 常用方法
     Session.destroy() :删除 session,当检测到客户端关闭时调用
     Session.reload() :当 session 有修改时,刷新 session
     Session.regenerate() :将已有 session 初始化
     Session.save() :保存 session

# 代码示例

var express = require('express');
var cookieParser = require('cookie-parser');
var session = require('express-session');
 
app.use(cookieParser('sessiontest'));
app.use(session({
 secret: 'sessiontest',// 与 cookieParser 中的一致
 resave: true,
 saveUninitialized:true
}));
// 修改 router/index.js,第一次请求时保存一条用户信息。
router.get('/', function(req, res, next) {
 var user={
  name:"Chen-xy",
  age:"22",
  address:"bj"
 }
 req.session.user=user;
 res.render('index', {
  title: 'the test for nodejs session' ,
  name:'sessiontest'
 });
});
//修改router/users.js,判断用户是否登陆。
router.get('/', function(req, res, next) {
 if(req.session.user){
  var user=req.session.user;
  var name=user.name;
  res.send('你好'+name+',欢迎来到我的家园。');
 }else{
  res.send('你还没有登录,先登录下再试试!');
 }
});

serve-favicon

设置网站的 favicon 图标

$ npm install serve-favicon
var express = require('express')
var favicon = require('serve-favicon')
var path = require('path')
 
var app = express()
app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')))
 
// Add your routes here, etc. 
 
app.listen(3000)

body-parser

bodyParser 用于解析客户端请求的 body 中的内容,内部使用 JSON 编码处理,url 编码处理以及对于文件的上传处理

$ npm install body-parser
var bodyParser = require('body-parser')

1、底层中间件用法:这将拦截和解析所有的请求;也即这种用法是全局的。

var express = require('express')
var bodyParser = require('body-parser')
  
var app = express()
  
// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: false }))
  
// parse application/json
app.use(bodyParser.json())
  
app.use(function (req, res) {
 res.setHeader('Content-Type', 'text/plain')
 res.write('you posted:\n')
 res.end(JSON.stringify(req.body, null, 2))
})

use 方法调用 body-parser 实例;且 use 方法没有设置路由路径;这样的 body-parser 就会对该 app 所有的请求进行拦截和解析

2、特定路由下的中间件用法:这种用法是针对特定路由下的特定请求的,只有请求该路由时,中间件才会拦截和解析该请求;也即这种用法是局部的;也是最常用的一个方式

var express = require('express')
var bodyParser = require('body-parser')
  
var app = express()
  
// create application/json parser
var jsonParser = bodyParser.json()
  
// create application/x-www-form-urlencoded parser
var urlencodedParser = bodyParser.urlencoded({ extended: false })
  
// POST /login gets urlencoded bodies
app.post('/login', urlencodedParser, function (req, res) {
 if (!req.body) return res.sendStatus(400)
 res.send('welcome, ' + req.body.username)
})
  
// POST /api/users gets JSON bodies
app.post('/api/users', jsonParser, function (req, res) {
 if (!req.body) return res.sendStatus(400)
 // create user in req.body
})

express 的 post(或者get)方法调用 body-parser 实例;且该方法有设置路由路径;这样的 body-parser 实例就会对该 post(或者get)的请求进行拦截和解析

3、设置 Content-Type 属性;用于修改和设定中间件解析的 body 内容类型

// parse various different custom JSON types as JSON
app.use(bodyParser.json({ type: 'application/*+json' });
 
// parse some custom thing into a Buffer
app.use(bodyParser.raw({ type: 'application/vnd.custom-type' }));
 
// parse an HTML body into a string
app.use(bodyParser.text({ type: 'text/html' }));

morgan

Mogran 是一个 node.js 关于 http 请求的 express 默认的日志中间件

npm install  morgan

basic.js中添加如下代码

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

app.use(morgan('short'));
app.use(function(req, res, next){
    res.send('ok');
});

app.listen(3000);

node basic.js运行程序,并在浏览器里访问 http://127.0.0.1:3000 ,打印日志如下

::1 - GET / HTTP/1.1 200 2 - 3.157 ms
::1 - GET / HTTP/1.1 304 - - 0.784 ms

morgan 支持 stream 配置项,可以通过它来实现将日志落地的效果,代码如下:

var express = require('express');
var app = express();
var morgan = require('morgan');
var fs = require('fs');
var path = require('path');

var accessLogStream = fs.createWriteStream(path.join(__dirname, 'access.log'), {flags: 'a'});

app.use(morgan('short', {stream: accessLogStream}));
app.use(function(req, res, next){
    res.send('ok');
});

app.listen(3000);

morgan 的 API 非常少,使用频率最高的就是morgan(),作用是返回一个 express 日志中间件

morgan(format, options)

参数说明如下:

format:可选,Morgan 与定义了几种日志格式,每种格式都有对应的名称,如 combined、short 等,默认是 default

options:可选,配置项,包含stream(常用)、skip、immediate

stream:日志的输出流配置,默认是 process.stdout

skip:是否跳过日志记录

immediate:布尔值,默认是 false。当为 true 时,一收到请求,就记录日志;如果为 false,则在请求返回后,再记录日志