Nodejs 開發(fā)服務(wù)端 - 常用第三方模塊

Nodejs 服務(wù)端開發(fā)涉及到很多平常比較陌生的第三方模塊,最近正好在做這一塊相關(guān)的內(nèi)容,就整理了一份比較常用的第三方模塊列表及其使用說明,這是《Nodejs開發(fā)服務(wù)端》系列的第一篇內(nèi)容,主要幫助大家快速了解 Nodejs 服務(wù)端開發(fā)所需要掌握的模塊

一、模塊概覽

二、模塊詳解

express

基于 nodejsweb 開發(fā)框架,何謂web開發(fā)框架?簡言之就是提供基于http請求的路由、模板引擎、靜態(tài)文件服務(wù)等能力的框架,可以快速地搭建一個(gè)完整功能的網(wǎng)站

  • 可以設(shè)置中間件來響應(yīng) HTTP 請求。
  • 定義了路由表用于執(zhí)行不同的 HTTP 請求動作。
  • 可以通過向模板傳遞參數(shù)來動態(tài)渲染 HTML 頁面。
var express = require('express');

// 獲取web服務(wù)實(shí)例
var app = express();

// 設(shè)置視圖模塊引擎和模塊地址
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

 // 添加一個(gè)get響應(yīng)路由,返回html字符串
app.get('/', function (req, res) {
  res.send('<p>歡迎來到小蜜豐mock后臺</p><br/><img style="width: 500px;" src="assets/test.png"/>')
})

 // 添加一個(gè)get響應(yīng)路由,返回html模板
app.get('/', function(req, res) {
  res.render('index/index', { title: 'HOME' });
});

// 設(shè)置靜態(tài)文件路徑
app.use('/assets', express.static(path.join(__dirname, 'assets')))

 // 服務(wù)的監(jiān)聽端口
var server = app.listen(8081, function () {
  var host = server.address().address
  var port = server.address().port
  console.log("應(yīng)用實(shí)例,訪問地址為 http://%s:%s", host, port)
})

實(shí)踐:使用Express搭建一個(gè)服務(wù)端簡易實(shí)例,使用axios完成請求

cookie-parser

基于 express 模塊的中間件,方便處理 cookie

var express=require('express');
var app=new express();
// 引入模塊
var cookieParser = require('cookie-parser');    
// 掛載中間件,可以理解為實(shí)例化
app.use(cookieParser("用于加密cookie的秘鑰secret")); 
// 創(chuàng)建cookie(創(chuàng)建 cookie 會在 http 響應(yīng)頭中添加Set-Cookie,從而在瀏覽器中設(shè)置 cookie)
res.cookie("key","value", {
    'maxAge': 90000,    // 有效時(shí)長,即90000毫秒后過期,String
    'signed': false     // 默認(rèn)為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");

// 設(shè)置中間件
app.use(session({
  secret: "用于加密cookie的秘鑰secret",
  resave: false, // 是否強(qiáng)制將會話保存回會話存儲
  saveUninitialized: true // 是否保存未初始化的會話
  store: new RedisStore()// 會話存儲實(shí)例,默認(rèn)為一個(gè)新的MemoryStore實(shí)例??梢允褂胷edis實(shí)例
  cookie: { maxAge: 1000*30*60 }, // 設(shè)置 session 的有效時(shí)間,單位毫秒:30分鐘
}))

// 設(shè)置 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');// 默認(rèn)監(jiān)聽6379端口,'127.0.0.1'為你本地ip(默認(rèn)不需要修改)
var RedisStore = require('connect-redis')(session);

// 執(zhí)行express
var app = express();
// 運(yùn)行cookieParser 方法
app.use(cookieParser());

// redis 鏈接錯(cuò)誤
client.on("error", function(error) {
    console.log(error);
});


//配置 session
var identityKey = 'skey';
app.use(session({
    name: identityKey,
    secret: 'sessiontest',  // 用來對session id相關(guān)的cookie進(jìn)行簽名
    store: new RedisStore(),  // (使用redis的存儲session)
    saveUninitialized: false,  // 是否自動保存未初始化的會話,建議false
    resave: false,  // 是否每次都重新保存會話,建議false
    cookie: {
        maxAge: 10*60 * 1000  // 有效期,單位是毫秒, 這里設(shè)置的是10分鐘
    }
}));

// 檢測 session是否正常
app.use(function (req, res, next) {
    if (!req.session) {
        return next(new Error('session錯(cuò)誤'))
    }else {
        console.log(req.session)//正常打印當(dāng)前session
    }
    next() // 正常 載入下一個(gè)中間件
})

// 讀取session
req.session.username
// 設(shè)置session
req.session.username='yonghuming'

mysql

用于nodejs連接mysql

var mysql      = require('mysql');
// 創(chuàng)建數(shù)據(jù)庫實(shí)例
var connection = mysql.createConnection({
  host     : 'localhost',
  user     : 'me',
  password : 'secret',
  database : 'my_db'
});
// 連接數(shù)據(jù)庫
connection.connect();
// 查詢數(shù)據(jù)庫
connection.query('SELECT 1 + 1 AS solution', function (error, results, fields) {
  if (error) throw error;
  console.log('The solution is: ', results[0].solution);
});
// 斷開數(shù)據(jù)庫
connection.end();

Sequelize

基于 nodejs 實(shí)現(xiàn)的 ORM(Object-Relational Mapping)框架,用來將數(shù)據(jù)庫數(shù)據(jù)轉(zhuǎn)成 js 對象 和 將 js 對象轉(zhuǎn)成數(shù)據(jù)庫的行。Sequelize支持多種數(shù)據(jù)庫,包括 MySQL,所以在 nodejs 中通常用 Sequelize 來操作和連接數(shù)據(jù)庫,而不是使用 mysql 庫去操作

// 1、創(chuàng)建一個(gè)sequelize對象實(shí)例
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如何映射數(shù)據(jù)庫表
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',// 實(shí)例對應(yīng)的表名
 timestamps: false // 關(guān)閉自動添加timestamp的功能
});

// 3、使用模型添加數(shù)據(jù)到數(shù)據(jù)庫
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、查詢數(shù)據(jù)
(async () => {
    var pets = await Pet.findAll({
        where: {
            name: 'Gaffey'
        }
    });
})();

nodemailer

基于 nodejs 實(shí)現(xiàn)的發(fā)送郵件模塊,非常強(qiáng)大

// 1、創(chuàng)建載體
var transporter = nodemailer.createTransport({
    host: 郵箱的smtp地址,
    auth: {
        user: 郵箱賬戶,
        pass: 郵箱授權(quán)碼
    }
});
// 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、發(fā)送郵件
var ret = await transporter.sendMail(mailInfo);

nodemon

nodejs中,每次修改文件都要在命令行工具中重新執(zhí)行該文件,非常繁瑣。使用nodemon后,當(dāng)文件被修改保存后,會自動執(zhí)行,用在開發(fā)調(diào)試的時(shí)候非常方便。

使用的時(shí)候在命令行中用nodemon命令代替node命令執(zhí)行文件即可:

# node,文件修改后要手動重新執(zhí)行
node ./bin/www

# ndoemon,文件修改后會自動重新執(zhí)行
nodemon ./bin/www

cross-env

運(yùn)行跨平臺設(shè)置的和使用環(huán)境變量(Node中的環(huán)境變量)的腳本,統(tǒng)一 windowsunix 對 Node 環(huán)境變量的設(shè)置方式,如下:

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

config

在程序部署過程中,不同的環(huán)境(生產(chǎn)環(huán)境、開發(fā)環(huán)境)程序的一些配置參數(shù)不同,比如數(shù)據(jù)庫信息配置。
對于配置的參數(shù),我們通常使用配置文件管理。在nodejs中,可以使用第三方模塊config模塊管理操作配置文件。
config模塊的作用是允許開發(fā)人員將不同運(yùn)行環(huán)境下的應(yīng)用配置信息抽離到單獨(dú)的文件中,模塊內(nèi)部自動判斷當(dāng)前應(yīng)用的運(yùn)行環(huán)境(環(huán)境變量配置的-NODE_ENV的值),并讀取對應(yīng)的配置信息,極大提供應(yīng)用配置信息的維護(hù)成本,避免了當(dāng)運(yùn)行環(huán)境重復(fù)的多次切換時(shí),手動到項(xiàng)目代碼中修改配置信息

本文為原創(chuàng),轉(zhuǎn)載請注明出處

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容