Nodejs 开发服务端 - 常用第三方模块

Nodejs 服务端开发涉及到很多平常比较陌生的第三方模块,最近正好在做这一块相关的内容,就整理了一份比较常用的第三方模块列表及其使用说明,这是《Nodejs开发服务端》系列的第一篇内容,主要帮助大家快速了解 Nodejs 服务端开发所需要掌握的模块

一、模块概览

二、模块详解

express

基于 nodejsweb 开发框架,何谓web开发框架?简言之就是提供基于http请求的路由、模板引擎、静态文件服务等能力的框架,可以快速地搭建一个完整功能的网站

  • 可以设置中间件来响应 HTTP 请求。
  • 定义了路由表用于执行不同的 HTTP 请求动作。
  • 可以通过向模板传递参数来动态渲染 HTML 页面。
var express = require('express');

// 获取web服务实例
var app = express();

// 设置视图模块引擎和模块地址
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

 // 添加一个get响应路由,返回html字符串
app.get('/', function (req, res) {
  res.send('<p>欢迎来到小蜜丰mock后台</p><br/><img style="width: 500px;" src="assets/test.png"/>')
})

 // 添加一个get响应路由,返回html模板
app.get('/', function(req, res) {
  res.render('index/index', { title: 'HOME' });
});

// 设置静态文件路径
app.use('/assets', express.static(path.join(__dirname, 'assets')))

 // 服务的监听端口
var server = app.listen(8081, function () {
  var host = server.address().address
  var port = server.address().port
  console.log("应用实例,访问地址为 http://%s:%s", host, port)
})

实践:使用Express搭建一个服务端简易实例,使用axios完成请求

cookie-parser

基于 express 模块的中间件,方便处理 cookie

var express=require('express');
var app=new express();
// 引入模块
var cookieParser = require('cookie-parser');    
// 挂载中间件,可以理解为实例化
app.use(cookieParser("用于加密cookie的秘钥secret")); 
// 创建cookie(创建 cookie 会在 http 响应头中添加Set-Cookie,从而在浏览器中设置 cookie)
res.cookie("key","value", {
    'maxAge': 90000,    // 有效时长,即90000毫秒后过期,String
    'signed': false     // 默认为false,表示是否签名,Boolean
})
// 获取cookie
var cookies = req.cookies      // 获取cookie集合
var value = req.cookies.key    // 获取名称为key的cookie的值
// 删除cookie
res.clearCookie("key")

express-session

基于 express 模块的中间件,方便处理 session,依赖于 cookie-parser 模块(session需要依赖于cookie)

var express=require('express');
var app=new express();
var session = require("express-session");

// 设置中间件
app.use(session({
  secret: "用于加密cookie的秘钥secret",
  resave: false, // 是否强制将会话保存回会话存储
  saveUninitialized: true // 是否保存未初始化的会话
  store: new RedisStore()// 会话存储实例,默认为一个新的MemoryStore实例。可以使用redis实例
  cookie: { maxAge: 1000*30*60 }, // 设置 session 的有效时间,单位毫秒:30分钟
}))

// 设置 session
app.get('/login', function (req, res) { 
    req.session.token="token";
    res.send('登录成功!'); 
});

// 读取 session
app.get('/userinfo', async function (req, res) { 
    var token = req.session.token;
    var userInfo = await getUserInfo(token)
    res.json(userInfo); 
});

connect-redis

node.js(express)中使用Redis持久化存储session。在node(express)中使用session需要先安装cookie-parserexpress-session模块。 为了持久化保存session我们使用Redis,需要安装redisconnect-redis模块。

// express 模块
var express = require('express');
// session 模块
var cookieParser = require('cookie-parser');
var session = require('express-session');
// redis 模块
var redis   = require('redis');
var client  = redis.createClient('6379', '127.0.0.1');// 默认监听6379端口,'127.0.0.1'为你本地ip(默认不需要修改)
var RedisStore = require('connect-redis')(session);

// 执行express
var app = express();
// 运行cookieParser 方法
app.use(cookieParser());

// redis 链接错误
client.on("error", function(error) {
    console.log(error);
});


//配置 session
var identityKey = 'skey';
app.use(session({
    name: identityKey,
    secret: 'sessiontest',  // 用来对session id相关的cookie进行签名
    store: new RedisStore(),  // (使用redis的存储session)
    saveUninitialized: false,  // 是否自动保存未初始化的会话,建议false
    resave: false,  // 是否每次都重新保存会话,建议false
    cookie: {
        maxAge: 10*60 * 1000  // 有效期,单位是毫秒, 这里设置的是10分钟
    }
}));

// 检测 session是否正常
app.use(function (req, res, next) {
    if (!req.session) {
        return next(new Error('session错误'))
    }else {
        console.log(req.session)//正常打印当前session
    }
    next() // 正常 载入下一个中间件
})

// 读取session
req.session.username
// 设置session
req.session.username='yonghuming'

mysql

用于nodejs连接mysql

var mysql      = require('mysql');
// 创建数据库实例
var connection = mysql.createConnection({
  host     : 'localhost',
  user     : 'me',
  password : 'secret',
  database : 'my_db'
});
// 连接数据库
connection.connect();
// 查询数据库
connection.query('SELECT 1 + 1 AS solution', function (error, results, fields) {
  if (error) throw error;
  console.log('The solution is: ', results[0].solution);
});
// 断开数据库
connection.end();

Sequelize

基于 nodejs 实现的 ORM(Object-Relational Mapping)框架,用来将数据库数据转成 js 对象 和 将 js 对象转成数据库的行。Sequelize支持多种数据库,包括 MySQL,所以在 nodejs 中通常用 Sequelize 来操作和连接数据库,而不是使用 mysql 库去操作

// 1、创建一个sequelize对象实例
const Sequelize = require('sequelize');
const config = require('./config');

var sequelize = new Sequelize(config.database, config.username, config.password, {
    host: config.host,
    dialect: 'mysql',
    pool: {
        max: 5,
        min: 0,
        idle: 30000
    }
});

// 2、定义模型Pet,告诉Sequelize如何映射数据库表
var Pet = sequelize.define('pet', {
    id: {
        type: Sequelize.STRING(50),
        primaryKey: true
    },
    name: Sequelize.STRING(100),
    gender: Sequelize.BOOLEAN,
    birth: Sequelize.STRING(10),
    createdAt: Sequelize.BIGINT,
    updatedAt: Sequelize.BIGINT,
    version: Sequelize.BIGINT
}, {
 tableName: 'pet',// 实例对应的表名
 timestamps: false // 关闭自动添加timestamp的功能
});

// 3、使用模型添加数据到数据库
var now = Date.now();
(async () => {
    var dog = await Pet.create({
        id: 'd-' + now,
        name: 'Odie',
        gender: false,
        birth: '2008-08-08',
        createdAt: now,
        updatedAt: now,
        version: 0
    });
    console.log('created: ' + JSON.stringify(dog));
})();

// 4、查询数据
(async () => {
    var pets = await Pet.findAll({
        where: {
            name: 'Gaffey'
        }
    });
})();

nodemailer

基于 nodejs 实现的发送邮件模块,非常强大

// 1、创建载体
var transporter = nodemailer.createTransport({
    host: 邮箱的smtp地址,
    auth: {
        user: 邮箱账户,
        pass: 邮箱授权码
    }
});
// 2、配置邮件信息
var mailInfo = {
    from: "xxxx@qq.com",
    to: "xxxx@qq.com",
    subject: "测试邮件✔", // Subject line
    text: "这是测试邮件", // plain text body
    html: '<img src="http://134.175.171.141/imgStation/imgs/2020-08-21_19_32_53cENl13AFKs.jpg">', // html body
};
// 3、发送邮件
var ret = await transporter.sendMail(mailInfo);

nodemon

nodejs中,每次修改文件都要在命令行工具中重新执行该文件,非常繁琐。使用nodemon后,当文件被修改保存后,会自动执行,用在开发调试的时候非常方便。

使用的时候在命令行中用nodemon命令代替node命令执行文件即可:

# node,文件修改后要手动重新执行
node ./bin/www

# ndoemon,文件修改后会自动重新执行
nodemon ./bin/www

cross-env

运行跨平台设置的和使用环境变量(Node中的环境变量)的脚本,统一 windowsunix 对 Node 环境变量的设置方式,如下:

cross-env NODE_ENV=production babel-node ./bin/www

config

在程序部署过程中,不同的环境(生产环境、开发环境)程序的一些配置参数不同,比如数据库信息配置。
对于配置的参数,我们通常使用配置文件管理。在nodejs中,可以使用第三方模块config模块管理操作配置文件。
config模块的作用是允许开发人员将不同运行环境下的应用配置信息抽离到单独的文件中,模块内部自动判断当前应用的运行环境(环境变量配置的-NODE_ENV的值),并读取对应的配置信息,极大提供应用配置信息的维护成本,避免了当运行环境重复的多次切换时,手动到项目代码中修改配置信息

本文为原创,转载请注明出处