這篇文章給大家介紹使用node腳手架如何搭建一個服務器,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
我們都知道 express 框架可高效的開發 node 服務器,但對于底層的搭建還要靠自己手寫。然而 express-generator 的出現就很好地解決了此問題,它可一鍵為我們生成項目基本骨架,可謂node 腳手架
①:首先全局安裝 express : npm install express -g
②:接著全局安裝 express-generator:npm install express-generator -g
③:然后使用命令創建項目: express token_learn(項目名稱)
對于好多習慣了手擼服務器的人,app.js 總是讓人難忘,奈何此骨架中入口文件為 www.js。此時我們可以手動修改app.js 代碼,讓其成為我們的入口文件
示例:
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
const index = require('./routes/index');
const users = require('./routes/users');
const app = express();
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use('/', index);
app.use('/users', users);
app.listen(3000, () => console.log('server is run 3000'))此處采用連接池的方式進行連接(高效安全)
①:安裝 mysql 模塊:npm i mysql
②:在項目根目錄下配置連接池
首先在項目根目錄下創建 util 文件夾,文件夾下創建 bdconfig.js 文件
bdconfig.js
const mysql = require('mysql');
module.exports = {
mysqlParams: {
host: 'localhost', //域名
port: '3306', //端口
user: 'root', //用戶名
password: 'myroot', //密碼
database: 'nodeapi' //數據庫
},
sySqlConnect(sql, sqlArr) {
return new Promise((resolve, reject) => { //用Promise對象將其改造,方便接收數據
const pool = mysql.createPool(this.mysqlParams);
pool.getConnection((err, conn) => {
if (err) {
reject(err)
} else {
conn.query(sql, sqlArr, (err, data) => { //操作數據庫
if (err) {
reject(err)
} else {
resolve(data)
}
})
conn.release() //釋放連接
}
})
})
}
}使用時只需要傳入 sql(sql語句)、sqlArr(參數),通過Promise 改造后可直接用返回值拿到結果
隨著web 的發展,session、cookie 的驗證方式弊端也愈發突出,此時token孕育而生,token的強大不僅限于其是無狀態的,還在于它可以跨域
①:首先安裝 jsonwebtoken 模塊:npm i jsonwebtoken
②:接著在項目中使用該模塊
const dbConfig = require('../util/dbconfig');
const jwt = require('jsonwebtoken');
const secret = 'login-rule'; //秘鑰規則(自定義)
token = async(req, res, next) => { //定義token驗證中間件函數(應用于除登錄外的每個請求)
if (req.headers.authorization) {
const token = req.headers.authorization;
const { id, username } = jwt.verify(token, secret); // 對token進行解密查找
let sql = 'select * from test where id=?';
let sqlArr = [id];
let result = await dbConfig.sySqlConnect(sql, sqlArr);
if (result.length === 0) {
res.status(200).send({ msg: '用戶錯誤' })
return
}
if (username !== result[0].username) {
res.status(200).send({ msg: '用戶錯誤' })
} else {
next()
}
} else {
res.status(200).send({ msg: '無效請求頭' })
}
}
login = async(req, res) => { //定義登錄接口(因為這個請求頭不攜帶token,所以引用在token驗證中間件之前)
let { username, password } = req.body;
let sql = 'select * from test where username=?';
let sqlArr = [username];
let result = await dbConfig.sySqlConnect(sql, sqlArr);
if (result.length) {
if (password === result[0].password) {
const { id, username } = result[0];
//對token進行加密響應個客戶端(參數1:傳值規則;參數2:加密規則; 參數3:定義時間)
const token = jwt.sign({ id, username }, secret, { expiresIn: 60 * 60 });
res.status(200).send({ msg: '登陸成功', token: token, status: 200 });
} else {
res.status(200).send({ msg: '登陸失敗', status: 422 });
}
} else {
res.status(200).send({ msg: '用戶名不存在', status: 401 })
}
}
// 驗證身份中間件
module.exports = {
token,
login
}③:在 app.js 中進行配置
// 寫在 app.use() 之后,路由之前
app.use('/users/loginjwt', token.login); //登錄接口(無需驗證token,所以寫在token中間件之前)
app.use(token.token);為確保身份唯一且有效:用戶每次發送登錄請求且登錄成功,服務器端都會響應給用戶一個含用戶信息(唯一)的加密 token(字符串),此時用戶接收到 token,并把 token 存儲在 sessionStorage 或 localStorage中(此處為)。同時用戶每次發送其他請求時,在請求頭中攜帶本地的 token,服務器端 token驗證中間件攔截請求,對 token進行解密,得到用戶信息并與數據庫比對,信息存在則放行(身份驗證成功)。

寫簡潔靜態頁面,且實現ajax 請求
login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src="../javascripts/jquery.min.js"></script>
<title>Document</title>
</head>
<body>
<form id="loginform">
<input type="text" name="username">
<input type="password" name="password">
<input type="submit" value="登錄">
</form>
<script>
$(function() {
$('#loginform').on('submit', function() {
const formdata = $(this).serialize()
$.ajax({
url: '/users/loginjwt',
type: 'post',
data: formdata,
success(res) {
if (res.status === 200) {
window.sessionStorage.setItem('token', res.token);
location.href = '/user/index.html'
}
}
})
return false
})
})
</script>
</body>
</html>index.html
<script>
if (!sessionStorage.getItem('token')) {
location.href = '/user/login.html'
}
</script>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src="../javascripts/jquery.min.js"></script>
<title>Document</title>
</head>
<body>
<h2>welcome index</h2>
<a href="javascript:;" rel="external nofollow" >退出登錄</a>
<script>
$(function() {
$.ajaxSetup({
// 發送請求前觸發
beforeSend(xhr) {
// 在此設置自定義請求頭
xhr.setRequestHeader('authorization', sessionStorage.getItem('token'))
}
})
$.ajax({
url: '/users',
success(res) {
console.log(res);
}
})
$('a').on('click', function() {
sessionStorage.clear();
location.href = '/user/login.html'
})
})
</script>
</body>
</html>值得注意的是,對于 本地 token 的驗證(是否存在)一定要寫在頁面最頂端(防止頁面加載,再次發送用戶列表請求)
對于 ajax請求頭,一個一個加真的很煩,此處用 $ajaxSetup方法,修改ajax 的默認配置 。配置過后,寫在其下邊的 ajax 請求,都會帶上請求頭。
關于使用node腳手架如何搭建一個服務器就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。