deno+mongo實戰踩坑記

自從 deno 1.0 發佈以來,有關 deno 的文章不少,大多數都是在討論怎麼安裝 deno 、deno 有哪些特色 、deno 和 node 有哪些異同、deno是否是 node 的替代品等。我們今天不討論這些,畢竟 Talk is cheap. Show me the code! 親自體驗一把 deno 開發帶來的快感、用 deno 搞一個「企業級」應用:deno-supermarket,難道不香嗎?html

deno 常見的一些坑

在實戰以前,仍是先來介紹幾個我在剛接觸 deno 時遇到的小坑。前端

權限標誌符位置的問題

咱們都知道, deno 默認是安全的,就是致使了默認狀況下是不容許訪問網絡、讀寫文件等。好比有個名爲 index.ts 的文件內容以下:node

import { serve } from "https://deno.land/std@0.50.0/http/server.ts";
const s = serve({ port: 8000 });
console.log("http://localhost:8000/");
for await (const req of s) {
  req.respond({ body: "Hello World\n" });
}

若是直接執行 deno run index.ts, 會報錯:git

error: Uncaught PermissionDenied: network access to "0.0.0.0:8000", run again with the --allow-net flag

因此咱們很天然的就會在啓動命令的最後加上 --allow-net ,以下:github

deno run index.ts --allow-net

可是,這樣仍然會報錯。查了資料才知道 ,--allow-net--allow-read 之類的標誌是不能夠放到文件名後面的,必須緊跟在 deno run 後面,好比,以下才是正確的:mongodb

deno run --alow-net index.ts

爲何調換了位置就不行呢? issue 上的回答是,若是 --allow-net 跟在文件名後面,是傳給 js 腳本的,而不是傳給 deno 的。想了解更多的,能夠看這個 confused by order of cli option flags。反正,記住一點就行:權限標誌必定要跟在 deno run 後面!express

由於咱們前端同窗大多數平時不多寫後臺,不太清楚安全的重要性,爲了不遇到各類權限問題,我建議平時在寫一些練手項目時,直接用 deno run -A 來啓用所有的權限。(這只是方便調試,在生產環境中必定要慎用!)npm

不穩定的 API

由於實戰過程當中使用了 mongodb , 因此須要引入 Deno 的第三方模塊 mongo,然而在啓動項目會報錯:json

error: TS2339 [ERROR]: Property 'openPlugin' does not exist on type 'typeof Deno'.

查了一下,發現是由於 openPlugin 這個方法目前還不穩定。默認狀況下,deno 只會提供穩定的 api。若是須要開啓不穩定 api,能夠添加 --stable 標誌。好比:後端

deno run -A --unstable index.ts

可能有人會問,-A--unstable 的位置調換會不會有問題。這個親測過不會有問題。只要標誌符在文件名稱以前就好了。

還有個問題,到底哪些是穩定 API,哪些是不穩定 API 呢?其實 deno 官方文檔已經幫咱們分好類的了,入口地址分別是:

若是你懷疑 --unstable 的做用,可使用下面的方法打印出 Deno 上的全部成員:

console.log(Object.keys(Deno).length)

使用 deno run --unstable index.ts 輸出的結果是 117,使用 deno run index.ts 輸出的結果是 88 。說明穩定的 api 有 88 個,不穩定的有 29 個。

deno 的一些使用技巧

從 node 切換到 deno, 咱們的開發思惟也要隨之轉變。因此,咱們再來看看 deno 的一些和 node 不同的開發技巧。

如何管理版本?

剛開始我也很疑惑:沒有了 package.json, 那怎麼控制各依賴的版本呀?好比,咱們有10個文件都依賴了 mongo@v0.0.6, 那每一個文件都使用如下代碼進行引入:

import { init, MongoClient } from 'https://deno.land/x/mongo@v0.6.0/mod.ts'

但是有一天,我忽然想把 0.6.0 升級到 0.7.0, 那怎麼辦呢?一個個文件的進行替換容易漏掉,固然也能夠全局搜索批量替換 。可是這種效率都不是很高。

官方給出的推薦作法是,使用 deps.ts 文件來引入遠程文件,並管理版本。(固然 ,文件名稱不必定叫作 deps.ts, 你也能夠改爲其餘的名稱)。具體作法就是,把全部用到的遠程依賴,都在 deps.ts 中引入 ,而且經過 Re-export 手段導出各依賴,而後其餘文件就能夠從 deps.ts 中拿到所須要的依賴了。

回到剛纔說10個文件都依賴到 mongo 的問題,若是改爲 deps.ts 文件來統一管理是這樣的:

export * from 'https://deno.land/x/mongo@v0.6.0/mod.ts'

而後那些須要用到 mongo 的文件,不要直接從遠程引入,而是從 deps.ts 中引入,以下:

import { init, MongoClient } from '../pathTo/deps.ts';

若是須要升級的話,咱們能夠直接把 deps.ts 裏面的 mongo 地址中的 0.6.0 改爲 0.7.0 就好了。

另外,有一點和 npm 相似的是,若是沒有指定版本號,即遠程地址中沒有指定版本,好比:

export * from 'https://deno.land/x/mongo/mod.ts'

就會默認安裝最新版的依賴。

如何查找一些對我有用的 deno 庫?

使用 node ,能夠到 npm 上查找一些庫。deno 也有相似的平臺,目前分爲兩種庫,一種是官方標準的,另一種是第三方的。標準庫能夠到這裏查找:Deno Standard Modules。第三方庫能夠到這裏查找: Deno Third Party Modules

實戰: 使用 deno 開發一個具有增刪查改的商城系統

OK, 具有以上的知識點,如今能夠實戰了。首先,須要保證你的電腦安裝了 deno 1.0 。另外,因爲用到了 mongodb ,因此須要你的電腦也要安裝 mongodb。

界面

先來看看咱們的商城的界面:

麻雀雖小五臟俱全哈!具有添加商品、查詢商品、刪除商品、修改商品的功能。這是典型的 REST API 風格的系統 。

項目結構

而後再來看看項目結構:

  • .deno_plugins: 這是 mongo 模塊所下載的動態連接庫,不用關注它。
  • congig/db.ts: 這是鏈接 mongodb 的相關配置文件。目前寫死的端口號是 27017 , 若是你的 mongodb 端口不是這個,能夠在這個文件裏面修改。
  • controllers/goods.ts: 這是實現增刪查改的邏輯代碼
  • public/index.html: 這是前端靜態頁面,跟 deno 無關的,咱們只須要用 deno 來服務該目錄就行。
  • deps.ts: 用來管理遠程依賴庫,而後 Re-export 出去給其餘文件使用。
  • server.ts 入口文件,跟咱們用 epress 或 koa 時的入口 文件 app.js 相似。

依賴模塊的選擇

由於該項目涉及到了先後端,若是使用 node 的話,通常會選擇 express 或 koa。一樣的,咱們使用 deno 也要選擇對應的框架 ,否則的話,http服務以及路由跳轉等都不是那麼容易處理的。deno 上的這類框架,比較多人 star 的是 oakabc,這裏咱們選擇使用 abc。

另外,由於使用 mongodb , 因此還須要引入 mongo

結束語

好啦,對於 deno 初體驗就寫到這啦, 具體的代碼這裏不打算貼出來了,有興趣的能夠前往 github 查看:

有問題的能夠一塊兒交流學習哈~

相關文章
相關標籤/搜索