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ù)等能力的框架颂郎,可以快速地搭建一個完整功能的網(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-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');// 默認監(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)一 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ā)人員將不同運行環(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)載請注明出處