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ù)等能力的框架颂郎,可以快速地搭建一個完整功能的網(wǎng)站

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

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

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

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

 // 添加一個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)用實例替劈,訪問地址為 http://%s:%s", host, port)
})

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

cookie-parser

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

var express=require('express');
var app=new express();
// 引入模塊
var cookieParser = require('cookie-parser');    
// 掛載中間件陨献,可以理解為實例化
app.use(cookieParser("用于加密cookie的秘鑰secret")); 
// 創(chuàng)建cookie(創(chuàng)建 cookie 會在 http 響應(yīng)頭中添加Set-Cookie,從而在瀏覽器中設(shè)置 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");

// 設(shè)置中間件
app.use(session({
  secret: "用于加密cookie的秘鑰secret",
  resave: false, // 是否強制將會話保存回會話存儲
  saveUninitialized: true // 是否保存未初始化的會話
  store: new RedisStore()// 會話存儲實例皂股,默認為一個新的MemoryStore實例墅茉。可以使用redis實例
  cookie: { maxAge: 1000*30*60 }, // 設(shè)置 session 的有效時間,單位毫秒: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');// 默認監(jiān)聽6379端口,'127.0.0.1'為你本地ip(默認不需要修改)
var RedisStore = require('connect-redis')(session);

// 執(zhí)行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相關(guān)的cookie進行簽名
    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錯誤'))
    }else {
        console.log(req.session)//正常打印當前session
    }
    next() // 正常 載入下一個中間件
})

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

mysql

用于nodejs連接mysql

var mysql      = require('mysql');
// 創(chuàng)建數(shù)據(jù)庫實例
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 實現(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)建一個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如何映射數(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',// 實例對應(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 實現(xiàn)的發(fā)送郵件模塊胳赌,非常強大

// 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后撼短,當文件被修改保存后,會自動執(zhí)行挺勿,用在開發(fā)調(diào)試的時候非常方便曲横。

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

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

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

cross-env

運行跨平臺設(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ā)人員將不同運行環(huán)境下的應(yīng)用配置信息抽離到單獨的文件中栏渺,模塊內(nèi)部自動判斷當前應(yīng)用的運行環(huán)境(環(huán)境變量配置的-NODE_ENV的值),并讀取對應(yīng)的配置信息锐涯,極大提供應(yīng)用配置信息的維護成本磕诊,避免了當運行環(huán)境重復(fù)的多次切換時,手動到項目代碼中修改配置信息

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末秀仲,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子壶笼,更是在濱河造成了極大的恐慌,老刑警劉巖雁刷,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件覆劈,死亡現(xiàn)場離奇詭異,居然都是意外死亡沛励,警方通過查閱死者的電腦和手機责语,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來目派,“玉大人坤候,你說我怎么就攤上這事∑蟛洌” “怎么了白筹?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長谅摄。 經(jīng)常有香客問我徒河,道長,這世上最難降的妖魔是什么送漠? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任顽照,我火速辦了婚禮,結(jié)果婚禮上闽寡,老公的妹妹穿的比我還像新娘代兵。我一直安慰自己,他們只是感情好爷狈,可當我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布植影。 她就那樣靜靜地躺著,像睡著了一般淆院。 火紅的嫁衣襯著肌膚如雪何乎。 梳的紋絲不亂的頭發(fā)上句惯,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天,我揣著相機與錄音支救,去河邊找鬼抢野。 笑死,一個胖子當著我的面吹牛各墨,可吹牛的內(nèi)容都是我干的指孤。 我是一名探鬼主播,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼贬堵,長吁一口氣:“原來是場噩夢啊……” “哼恃轩!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起黎做,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤叉跛,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后蒸殿,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體筷厘,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年宏所,在試婚紗的時候發(fā)現(xiàn)自己被綠了酥艳。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡爬骤,死狀恐怖充石,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情霞玄,我是刑警寧澤骤铃,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站坷剧,受9級特大地震影響劲厌,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜听隐,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一补鼻、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧雅任,春花似錦风范、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至禽车,卻和暖如春寇漫,著一層夾襖步出監(jiān)牢的瞬間刊殉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工州胳, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留记焊,地道東北人。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓栓撞,卻偏偏與公主長得像遍膜,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子瓤湘,可洞房花燭夜當晚...
    茶點故事閱讀 44,901評論 2 355