国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 開(kāi)發(fā) > JS > 正文

Koa 中的錯(cuò)誤處理解析

2024-05-06 16:49:41
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

不像 express 中在末尾處注冊(cè)一個(gè)聲明為 (err, req, res, next) 中間件的方式,koa 剛好相反,在開(kāi)頭進(jìn)行注冊(cè)。

app.use(async (ctx, next) => { try {  await next(); } catch (err) {  ctx.status = err.status || 500;  ctx.body = err.message;  ctx.app.emit("error", err, ctx); }});

這樣程序中任何報(bào)錯(cuò)都會(huì)收斂到此處。此時(shí)可以方便地將錯(cuò)誤打印到頁(yè)面,開(kāi)發(fā)時(shí)非常便捷。

+   ctx.app.emit('error', err, ctx);

koa 也建議通過(guò) app 來(lái)派發(fā)錯(cuò)誤,然后通過(guò)監(jiān)聽(tīng) app 上的 error 事件對(duì)這些錯(cuò)誤做進(jìn)一步的統(tǒng)一處理和集中管理。

app.on("error", (err, ctx) => { /* 錯(cuò)誤的集中處理:  * log 出來(lái)  * 寫(xiě)入日志  * 寫(xiě)入數(shù)據(jù)庫(kù)  *  ...  */});

一個(gè)錯(cuò)誤捕獲并打印到頁(yè)面的示例:

const Koa = require("koa");const app = new Koa();app.use(async (ctx, next) => { try {  await next(); } catch (err) {  const status = err.status || 500;  ctx.status = status;  ctx.type = "html";  ctx.body = `  <b>${status}</b> ${err}  `;  // emmit  ctx.app.emit("error", err, ctx); }});app.use(ctx => { const a = "hello"; a = "hello world!"; // TypeError: Assignment to constant variable. ctx.body = a;});app.on("error", (err, ctx) => { console.error("Ooops../n", err);});app.listen(3000);

通過(guò) node server.js 啟動(dòng)后訪問(wèn)頁(yè)面可看到命令行的錯(cuò)誤輸出。

如果使用 pm2,可通過(guò) —no-daemon 參數(shù)使其停留在在命令行以查看輸出。

如果不使用上述參數(shù),可通過(guò) pm2 logs [app-name] 來(lái)查看。

ctx.throw

樸素的拋錯(cuò)方式需要手動(dòng)設(shè)置狀態(tài)碼及信息對(duì)客戶端的可見(jiàn)性。

const err = new Error("err msg");err.status = 401;err.expose = true;throw err;

expose 決定是否會(huì)返回錯(cuò)誤詳情給客戶端,否則只展示狀態(tài)對(duì)應(yīng)的錯(cuò)誤文案,比如 500 會(huì)在瀏覽器中展示為 Internal Server Error 。

而通過(guò) ctx.throw 這個(gè) helper 方法會(huì)更加簡(jiǎn)潔。

上面的代碼片段等價(jià)于:

ctx.throw(401, "err msg");

如果不指定狀態(tài)碼,默認(rèn)為 500。5xx 類(lèi)錯(cuò)誤 expose 默認(rèn)為 false ,即不會(huì)將錯(cuò)誤信息返回到 response。

拋錯(cuò)時(shí)還可以傳遞一些額外數(shù)據(jù),這些數(shù)據(jù)會(huì)合并到錯(cuò)誤對(duì)象上,在處理錯(cuò)誤的地方可以從 error 上獲取。

app.use(ctx => { ctx.throw(401, "access_denied", { user: { name: "foo" } });});app.on("error", (err, ctx) => { console.error("Ooops../n", err.user);});

參考

Error Handling
ctx.throw

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持VeVb武林網(wǎng)。


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到JavaScript/Ajax教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 余江县| 治多县| 昭平县| 恩平市| 常山县| 柳河县| 顺昌县| 大田县| 平塘县| 武鸣县| 新安县| 沅江市| 凤山县| 广丰县| 海淀区| 台前县| 山阴县| 应城市| 庄浪县| 叙永县| 平南县| 新竹市| 象山县| 永顺县| 黄龙县| 长岛县| 额尔古纳市| 正阳县| 怀化市| 仪陇县| 滕州市| 阳曲县| 平泉县| 台州市| 团风县| 成武县| 沙洋县| 梅州市| 石嘴山市| 台州市| 东方市|