A. nodejs mysql koa 怎麼做登錄
利用 Express 中間件功能實現登錄攔截。如果用戶請求的路徑需要登錄後才能訪問,將用戶重定向到登錄頁面,登錄成功後將用戶重定向到原始請求路徑。
設置應用中間件,監控所有請求
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// app.js
app.use(function (req, res, next) {
if (req.session.user) { // 判斷用戶是否登錄
next();
} else {
// 解析用戶請求的路徑
var arr = req.url.split('/');
// 去除 GET 請求路徑上攜帶的參數
for (var i = 0, length = arr.length; i < length; i++) {
arr[i] = arr[i].split('?')[0];
}
// 判斷請求路徑是否為根、登錄、注冊、登出,如果是不做攔截
if (arr.length > 1 && arr[1] == '') {
next();
} else if (arr.length > 2 && arr[1] == 'user' && (arr[2] == 'register' || arr[2] == 'login' || arr[2] == 'logout')) {
next();
} else { // 登錄攔截
req.session.originalUrl = req.originalUrl ? req.originalUrl : null; // 記錄用戶原始請求路徑
req.flash('error', '請先登錄');
res.redirect('/user/login'); // 將用戶重定向到登錄頁面
}
}
B. nodejs-koa2(mvc模式)前後端分離 前端設計
前後端分離,前端nodejs運行環境,使用koa2集成負責資源分配與用戶交互,實現token驗證用戶身份,路由控制。等!
自行 網路 解決;
"program": "${workspaceFolder}app.js"
此處就是是將app.js作為啟動文件。${workspaceFolder}代表根目錄,vsc啟動時會在根目錄下找到並載入app.js文件。
參數介紹: name 項目名稱、 version 版本號、 description 項目描述、 main 項目啟動文件、 scripts 啟動快捷設置, author 作者, dependencies 第3方中間件名稱及版本。
最重要的
「 dependencies 」這里添加一些要用到的包,以上是這次要用到的所有的包,版本自己更改。
「 scripts 」這里是一些nodejs的便捷命令,上線的時候會用到,直接在終端中,package.json同級目錄 ,執行『npm start』 即 可啟動app.js。
別的沒啥太大作用瞎寫即可。
啟動相關配置,封裝到config/init.js中,啟動文件直接引用即可
3-6-1、init.js項目核心。
異常友好處理方法封裝
路由配置
視圖渲染
核心集成
3-6-2、config.js項目參數配置。為什麼不用json文件 因為json不能加註釋
3-6-3、token.js項目token相關方法封裝。
執行後項目結構會增加兩個文件
新增
src/hello.js。
views/index.html
瀏覽器訪問: http://127.0.0.1:3000/koa/login
輸入值獲取token
獲取的token如圖:
先不用帶token進行訪問: http://127.0.0.1:3000/koa/ hello/jiaobaba,被token攔截,返回401
帶上token訪問: http://127.0.0.1:3000/koa/ hello/jiaobaba
測試頁面渲染,及跳轉html頁面,直接訪問 http://127.0.0.1:3000/koa /views
結束!!!!!!
需要源碼聯系我
C. nodejs 微信支付 (koa 框架)
根據官方微信支付的 文液遲檔
和流程圖
支付過程可以分為 後端流程 和 前端流程
根據經驗 簽名錯誤是xml的加密出錯了
這里貼出一個提交統一下單的原始xml
這里說明一下: 經過親測禪滲 spbill_create_ip , notify_url 這兩個參數即使是寫死的也不是導致 簽名錯誤 的原因
檢查商戶信息,也就是商戶號 mch_id 和商戶的 key (這里需要注意 key ,是申請微信支付成功後,騰訊發給申請者郵件裡面的秘鑰,要鬧襲李想此秘鑰生效還需要安裝 操作證書 )
D. koa如何返回數據給前端
Koa 是一個基於 Node.js 的後端框架,可以用來返回數據給前端。
在 Koa 中褲咐腔,可以簡祥使用 ctx.body 來設置響應體,並使用 ctx.status 來設置響應狀態碼。例如,在 Koa 中返回 JSON 數據,可以使用以下代碼:
const Koa = require('koa');
const app = new Koa();
app.use(async (ctx) => {
ctx.body = { message: 'Hello, World!' };
ctx.status = 200;
});
app.listen(3000);
console.log('Server running on port 3000');
這段代碼創建了一個 Koa 應用,使用 app.use 方法綁定一個中間件來處理請求,然後使用 ctx.body 和 ctx.status 來設置響應體和狀態碼。
除了使用 ctx.body 和 ctx.status 來返胡衫回數據之外,還可以使用 koa-json、koa-jsonp、koa-send等中間件來返回 json 數據。
E. Koa 學習總結
Koa是基於Node.js的下一代web框架,由Express團隊打造,特點:優雅、簡潔、靈活、體積小。幾乎所有功能都需要通過中間件實現。
即便沒有給ctx.body 設置響應數據,或訪問不存在的路由,頁面也會顯示Not Found,這是koa底層做了處理,不像原生Node或Express一樣頁面會一直處於響應狀態。
Koa將Node的request 和 response對象都封裝到了context中,每次請求都會創建一個ctx,並且在中間件中作為接收器使用。
以下是剛才訪問時的ctx對象
即便使用ctx.res.write()也不會得到預期結果,比如:ctx.res.write('hello'),結果是hellook,會把message的值拼接上。
有關cookie和session單獨介紹用法。
Koa中的路由和Express不同,Express是把路由集成在Express中,Koa則需要通過kao-router模塊使用。
Koa最大的特色和最優的設計就是中間件,就是在匹配路由之前和匹配路由之後執行函數。
使用app.use()載入中間件。每個中間件接收兩個參數,ctx對象和next函數,通過調用next將執行權交給下一個中間件。
中間件分為:
對於諸如js、css、img等靜態資源採用koa-static中間件處理。
比如靜態目錄為static:
在模板中即可訪問:
koa生態的模板引擎挺多的,比如ejs、art-template等。
使用方式和ejs一樣。
性能上相比,art-template比ejs快很多,開發中用的最多的還是art-template。
http是無狀態、無連接的。不會對之前發生過的請求和相應狀態進行管理團物。也就是說,無法根據之前的狀態進行本塌喊液次的請求處理。
比如訪問淘寶首頁並登錄賬號後,當再打開淘寶其他頁面時,因為每一次的訪問都是獨立的,伺服器並不知道你已經登錄,所以還是不能下單或者加購物車之類的操作。
cookie是客戶端第一次訪問伺服器的時候,伺服器在下行HTTP報文時通過響應頭的 set-cookie 欄位給瀏覽器分配的一個具有特殊標識的文本信息,此後當客戶端再次訪問同一域名時,便會將該欄位通過請求頭攜帶到伺服器。注意: 第一次訪問伺服器是不可能攜帶cookie的。
缺陷: 1、cookie的數據存放在客戶端,不安全,容易被(CSRF)跨站請求偽造。攻擊者可以藉助受害者的 Cookie 騙取伺服器的信任,可以在受害者毫不知情的情況下以受害者名義偽造請求發送給受攻擊伺服器,從而在並未授權的情況下執行在許可權保護之下的操作。2、單個cookie保存的數據不能超過4K,很多瀏覽器都限制一個站點最多保存20個cookie。
通過 options 獲取 cookie name:
通過 options 設置 cookie name 的 value:
通過buffer轉成base64存進去,取出來是再轉回中文。
session是另一種記錄客戶狀態的機制,不同的是cookie保存在客戶端瀏覽器中,而session保存在伺服器上。
前面說過,cookie 是存放在客戶端,不是很安全,用戶可以自己手動把cookie種在客戶端以欺騙伺服器。而session是存儲在服務滲櫻端的,所以對於較重要的數據存儲在session。
缺點: session會在一定時間內保存在伺服器上。當訪問增多,會比較佔用你伺服器的性能。
當瀏覽器第一次請求伺服器時,伺服器端會創建一個session對象,生成一個類似於key-value的鍵值對, 然後將key(cookie)下發到客戶端,當客戶端再訪問時,攜帶key(cookie),找到對應的session(value)。 生產中用戶的信息都保存在session中。
以上配置選項常用的就是key、maxAge、httpOver。
renew應用:比如我們登錄賬號寫一篇博客,寫了一半cookie過期了,當我們提交的時候就會退出登錄,體驗很不好,而且寫好的博客丟失。
301和302重定向狀態碼區別。302為臨時重定向,301永久重定向。Koa中默認為302。詳細信息查看這篇博客 301和302重定向介紹
字元串 「back」 是特別提供Referrer支持的,當Referrer不存在時,使用 alt 或「/」。
要更改 「302」 的默認狀態,只需在該調用之前或之後分配狀態。要變更主體請在此調用之後:
解決跨域的方式有很多種,個人認為最好的方案是在伺服器端設置支持跨域。
下面詳細說明在koa2中設置具體的請求頭信息:
在koa2中,解決跨域請求還可使用中間件 koa2-cors
node 發送郵件可以使用 nodemailer 三方模塊。
安裝:
使用說明:
更多詳細配置信息及功能參照 官網
F. nextjs的路由和koa
這邊有一點是需要認識到的就是,koa和next之間的結合,正常來說我們在使用nextjs的時候,已經被提供了一個server足以讓整個next項目運行期倆,那麼為什麼我們還要引入koa?
因為我們需要解決一些問題:
動態路由:比如: www.xxxx.com/a/1 一但刷新,那麼就意味著404的錯誤會發生,
但是這個是彎螞螞make sense的,因為page裡面本來就沒有a/1這個文件
所以這里我們就要koa來作為中間件來幫助我們解決這埋埋個問題
'''
router.get('/a/:id', async (ctx) => {
const id = ctx.params.id;
await handler(ctx.req, ctx.res, {
pathname:'/a',
query: {id}
})
ctx.response = false
})
server.use(router.routes())
'''
上面的這段koa就會幫助我們
當訪問了/a/id, koa的伺服器就會輔助我們把router裡面的事情在物逗做一遍,這樣就能幫助整個系統來找到這個動態的路徑
G. 如何優雅的在 koa 中處理錯誤
使用中間件統一處理錯誤
有了上面的說明,那現在我們就來看看在 koa 裡面怎麼喊臘優雅的實現統一錯誤處理。
答案就是使用強大的中間件!
我們可以在業務邏輯中間件(一般就是 MVC 中的 Controller)開始之前定義下面的中間件:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
app.use(function* (next) {
try {
yield* next;
} catch(e) {
let status = e.status || 500;
let message = e.message || '伺服器錯誤';
if (e instanceof JsonError) { // 錯誤是 json 錯誤
this.body = {
'status': status,
'message': message
};
if (status == 500) {
// 觸發 koa 統一錯誤事件,可以列印出詳細的錯誤堆棧 log
this.app.emit('error', e, this);
}
return;
}
this.status = status;
// 根據 status 渲染不同的頁面
if (status == 403) {
this.body = yield this.render('403.html', {'err': e});
}
if (status == 404) {
this.body = yield this.render('404.html', {'err': e});
}
if (status == 500) {
this.body = yield this.render('500.html', {'err': e});
// 觸發 koa 統一錯誤事件,可以列印出詳細的錯誤堆棧 log
this.app.emit('error', e, this);
}
}
});
可以看到,我們直接執行 yield* next,然後 catch 執行過程中任何一個中間件的錯誤,然後根據錯誤的「特性」,分別進行不同的處理。
有了這個中間件,我們的業務邏輯 controller 中的代碼就可以這樣來觸發錯誤:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
const router = new (require('koa-router'));
router.get('/some_page', function* () {
// 直接拋出錯誤,被中間件捕獲後當成 500 錯誤
throw new PageError('發生了一個致命錯誤');
throw new JsonError('發送了一個致悄冊命錯誤');
// 帶 status 的錯誤,被中間件捕獲後特殊處理
this.throw(403, new PageError('沒有許可權訪問'));
this.throw(403, new JsonError('沒有許可權訪問'));
});
對 Error 分類
上面的代碼裡面出現的 JsonError、PageError,實際上是繼承於 Error 的兩個構造器。代碼鄭運滑如下:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
const util = require('util');
exports.JsonError = JsonError;
exports.PageError = PageError;
function JsonError(message) {
Error.call(this, message);
}
util.inherits(JsonError, Error);
function PageError(message) {
Error.call(this, message);
}
util.inherits(PageError, Error);
通過繼承 Error 構造器,我們可以將錯誤進行細分,從而能更精細的對錯誤進行處理。
H. 用Koa實現一個較完整的登錄注冊功能需要用到哪些模塊
登錄注冊涉及哪些功能?
基礎 mvc 生吵毀成頁面
處理登錄,注冊表單
登錄狀態
用戶數據存儲
找回密碼
對下來要用到的模塊:
koajs/ejs · GitHub、alexmingoia/koa-router · GitHub 實現 mvc
koajs/bodyparser · GitHub 用來處理登錄注冊的 post 上來的 HTTP body 中的數據
expressjs/cookie-parser · GitHubkoajs/升陵備session · GitHub cookie 解析以及基於 cookie 的 session 管理,用來保存用戶的登錄狀態,也可以使用 Chilledheart/koa-session-redis · GitHub 來把 session 保存在 redis 中,等等
Automattic/mongoose · GitHub 資料庫,保存用戶信息
andris9/Nodemailer · GitHub 發郵件
整個應用的文件劃分可參考:gusnips/汪汪node-koa-mvc · GitHub