Nodejs 服務(wù)端開發(fā)涉及到很多平常比較陌生的第三方模塊,最近正好在做這一塊相關(guān)的內(nèi)容,就整理了一份比較常用的第三方模塊列表及其使用說明,這是《Nodejs開發(fā)服務(wù)端》系列的第一篇內(nèi)容,主要幫助大家快速了解 Nodejs 服務(wù)端開發(fā)所需要掌握的模塊
一、模塊概覽
- express
- cookie-parser
- express-session
- connect-redis
- mysql
- Sequelize
- nodemailer
- nodemon
- cross-env
- config
二、模塊詳解
express
基于 nodejs 的 web 開發(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-parser和express-session模塊。 為了持久化保存session我們使用Redis,需要安裝redis和connect-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)一 windows 和 unix 對 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)載請注明出處