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的值),并读取对应的配置信息,极大提供应用配置信息的维护成本,避免了当运行环境重复的多次切换时,手动到项目代码中修改配置信息

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269