Node.js + MongoDB 后端學習筆記

學習后端有兩個禮拜了屹逛。當然疾渣,實際學習時間不過三四天拴魄,但感覺入門木有問題了冗茸,起碼我的目標:為前端提供數(shù)據(jù)支持已經(jīng)沒有問題了。其他復雜的邏輯和數(shù)據(jù)處理就等需要的時候邊學邊做吧匹中。
在這里主要總結和探討下后端知識以及如何更快的掌握一門新技術夏漱。

Node.js學習

學習目標:為前端提供 RESTful API 接口。

Node方面顶捷,我快速瀏覽一遍基礎教程挂绰,對很多知識點都是了解即可。主要是關注在寫 RESTful 接口這一塊的知識點:

  • 全局對象 —— 了解node中經(jīng)常出現(xiàn)的全局對象是必要的服赎。
  • 常用模塊 —— 對出現(xiàn)頻率搞得模塊要熟悉的葵蒂,如 fs交播、http、util 等
  • GET践付、POST 請求和 RESTful API —— 這是我的主要學習目標秦士,認真看完并且照著示例代碼實現(xiàn)一遍。
  • Express 框架 —— 已知的比較適合新手學習的node框架永高,熟悉基本用法隧土,照著實現(xiàn)一遍。
  • 連接 MongoDB —— 學習如何連接MongoDB命爬,這個在學習了MongoDB基本知識后重點學習次洼。

因為暫時只為了提供接口,所以只要對Node有個大致的了解遇骑。然后重點關注寫接口、數(shù)據(jù)庫和框架揖曾。當我看完一遍資料落萎,并將重點的知識點實際操作實現(xiàn)一遍之后,我對 node 就有了大致了解了~達到了給我一個 Node 后端項目我能看懂大部分代碼邏輯的程度炭剪。之后看一下 Express 框架~

Express

學習目標: 使用 Express 快速搭建 Node 后端項目练链,配合之前學到的 Node 基礎知識為前端提供 API 接口支持

這里把 Express 的官方文檔API看了一遍,發(fā)現(xiàn)呢其實 Express 的東西不多奴拦,在看過node基本知識后還是很好理解的媒鼓。
我就用了 Express 提供的應用生成器生成一個 Express 項目。項目很簡單错妖,主要是修改 app.jsroutes 文件夾里面的東西绿鸣,寫法與Node教程里的差不多。在終端執(zhí)行 $ npm start 命令即可進行調(diào)試暂氯。
一開始我還沒學習MongoDB的時候我是用的JSON文件來存取數(shù)據(jù)的下面是我寫的一段代碼

var express = require('express');
var fs = require('fs')
var router = express.Router();

router.get('/', function (req, res, next) {
    res.send('Hello World');
});

// 獲取所有數(shù)據(jù)
router.get('/getlist', function (req, res, next) {
    fs.readFile(__dirname + '/data/plan.json', 'utf8', function (err, data) {
        if (err) {
            res.send(err)
        } else {
            res.send(data)
        }
    })
})

router.get('/test', function (req, res, next) {
    fs.readFile(__dirname + '/data/plan.json', 'utf8', function (err, data) {
        var name = req.query.name
        var hasVal = false
        if (name == undefined) {
            res.send('need name')
        } else if (err) {
            res.send(err)
        } else {
            var obj = JSON.parse(data)
            for (var key in obj) {
                if (obj[key].name == name) {
                    hasVal = obj[key]
                }
            }
            if (hasVal) {
                res.send(JSON.stringify(hasVal))
            } else {
                res.send('name no found')
            }
        }
    })
})

module.exports = router;

通過 node 的文件模塊來獲取 plan.json 文件潮模,這樣就實現(xiàn)了使用 Express 框架寫 GET 接口的目標。訪問 http://localhost:8082/file/getlist 獲取如下結果:

[
  { "Date": "2017-6-11", "Time": "10:22", "Detail": "洗澡", "Describe": "寶寶洗干凈" }, 
  { "Date": "2017-6-13", "Time": "10:22", "Detail": "開飯", "Describe": "寶寶要吃飯" }
 ]

調(diào)試過程建議使用Postman痴施,調(diào)試各類接口都特別方便擎厢。

數(shù)據(jù)庫

學習目標:了解 MongoDB 基本知識,重點掌握數(shù)據(jù)的增刪改查和 MongoDB 與 Node.js 的連接

接下來轉(zhuǎn)戰(zhàn)數(shù)據(jù)庫辣吃,這里選擇了 MongoDB 动遭。在明確了學習目標之后,重點學習增刪改查和數(shù)據(jù)庫連接神得,其他的以了解為主厘惦。就在這樣的目標之下,重點學習以下知識:

  • 安裝循头、創(chuàng)建數(shù)據(jù)庫以及數(shù)據(jù)庫的一些常用操作绵估。
  • 找到一個好的數(shù)據(jù)庫 GUI —— 發(fā)現(xiàn)了 Robomongo炎疆,感覺挺好用的。
  • 創(chuàng)建国裳、刪除數(shù)據(jù)庫形入。
  • 插入、更新缝左、查詢亿遂、刪除文檔 —— 這當然是重中之重,所有示例逐個實現(xiàn)一遍
  • 除此之外渺杉,想數(shù)據(jù)處理蛇数、比較、數(shù)據(jù)數(shù)量限制limit是越、排序sort等了解即可耳舅,需要的時候查閱一下就可以解決問題。

配合Node里面的 Node.js MongoDB 章節(jié)倚评,動手實踐連接后端與數(shù)據(jù)庫了浦徊。照著教程來連接成功應該不難。成功在 Express 項目中獲取到數(shù)據(jù)庫數(shù)據(jù)就說明連接成功了√煳啵現(xiàn)在就可以開始你的表演了盔性!
除了GET和POST,另外兩個請求的寫法差不多呢岗,DELETE類似GET方法冕香,而PUT類似POST方法。
哦后豫,對了悉尾,數(shù)據(jù)庫和node的連接所用的中間件有mongodb、mongoose等硬贯,我簡單粗暴焕襟,用的最基本的MongoDB來寫的。下面是我寫的第一個后端接口代碼:

plan.js

var DBUtils = require('./DBUtils')
var express = require('express');
var fs = require('fs')
var router = express.Router();
var bodyParser = require('body-parser')
var ObjectID = require('mongodb').ObjectID

// 創(chuàng)建 application/x-www-form-urlencoded 編碼解析
var urlencodedParser = bodyParser.urlencoded({ extended: false })

router.get('/', function (req, res, next) {
    res.send('Hello MongoDB');
});

router.get('/findAllPlan', function (req, res, next) {
    DBUtils.getDB(function (db) {
        var collection = db.collection('plan')
        collection.find().toArray(function (err, result) {
            if (err) {
                console.log('Err:' + err)
                return
            }
            console.log(result)
            res.send(result)
            db.close()
        })
    })
});

router.get('/findPlanByDate', function (req, res, next) {
    DBUtils.getDB(function (db) {
        var collection = db.collection('plan')
        var Date = req.query.Date
        console.log(Date)
        var whereStr = { 'Date': Date }
        collection.find(whereStr).toArray(function (err, result) {
            if (err) {
                console.log('Err:' + err)
                return
            }
            console.log(result)
            res.send(result)
            db.close()
        })
    })
})

router.get('/findPlanById', function (req, res, next) {
    DBUtils.getDB(function (db) {
        var collection = db.collection('plan')
        var whereStr = { '_id': ObjectID(req.query._id) }
        collection.find(whereStr).toArray(function (err, result) {
            if (err) {
                console.log('Err:' + err)
                return
            }
            console.log(result)
            if (result.length > 0) {
                res.send(result[0])
            } else {
                res.send({ 'msg': '未找到相應數(shù)據(jù)' })
            }
            db.close()
        })
    })
})

router.post('/', urlencodedParser, function (req, res, next) {
    DBUtils.getDB(function (db) {
        var collection = db.collection('plan')
        console.log(req.body)
        var response = {
            'Date': req.body.Date,
            'Time': req.body.Time,
            'Title': req.body.Title,
            'Describe': req.body.Describe
        }
        collection.insert(response, function (err, result) {
            if (err) {
                console.log('Error:' + err)
                return
            }
            res.send({ 'msg': '添加成功' })
        })
    })
})

router.put('/', urlencodedParser, function (req, res, next) {
    DBUtils.getDB(function (db) {
        var collection = db.collection('plan')
        var whereStr = {
            '_id': ObjectID(req.body._id),
        }
        var response = {
            'Date': req.body.Date,
            'Time': req.body.Time,
            'Title': req.body.Title,
            'Describe': req.body.Describe
        }
        collection.update(whereStr, { $set: response }, function (err, result) {
            if (err) {
                console.log('Error:' + err)
                return
            }
            res.send({ 'msg': '更新成功' })
        })
    })
})

router.delete('/', function (req, res, next) {
    DBUtils.getDB(function (db) {
        var collection = db.collection('plan')
        var Id = req.query.Id
        var whereStr = { '_id': ObjectID(Id) }
        collection.remove(whereStr, function (err, result) {
            if (err) {
                console.log('Error:' + err)
                return
            }
            res.send({ 'msg': '刪除成功' })
        })
    })
})

module.exports = router

DBUtils.js

var MongoClient = require('mongodb').MongoClient
var DB_COUN_STR = 'mongodb://localhost:8081/etdb'// 數(shù)據(jù)庫地址

module.exports = {
    getDB: function (callback) {
        MongoClient.connect(DB_COUN_STR, function (err, db) {
            callback(db)
        })
    }
}

關于跨域問題

由于都是本地服務器 localhost饭豹,遇到了跨域的問題鸵赖,后來找到了最簡單粗暴的方法,安裝一個 cors 中間件就好了拄衰。具體用法:

$ npm install cors --save

app.js 中使用 cors

var cors = require('cors');
app.use(cors())

關于學習效率

學習后端和數(shù)據(jù)庫實際就花了三四天吧它褪,感覺自己學習效率還是可以的。分享下我的學習方法翘悉。

  • 明確學習目標茫打,學習始終圍繞著目標來。
  • 快速瀏覽學習資料,找出與學習目標有關的資料重點學習老赤。
  • 使用番茄時間工作法轮洋,將專注集中到一個時間段上,勞逸結合抬旺。不推薦一口氣看三四個小時弊予,效率會低下的。
  • 學習技術必須邊看資料开财,邊敲代碼汉柒。木有實踐的知識難以理解也不容易被記住。
  • 寫博客责鳍、筆記記錄總結學到的知識點碾褂。學會和能教是兩種境界。

總的來說历葛,我感覺學習新技術首先是要有個目標——學習這門新技術目標是什么正塌?然后根據(jù)目標來學習。先快速瀏覽篩選出能幫我們實現(xiàn)目標的知識恤溶,然后抓重點學習传货。這樣學習才能夠快速掌握一門知識。書上說過:一本書只有20%的知識是常用的宏娄,只要掌握了這20%就可以運用這項知識了,所以我們要根據(jù)目標找準那20%的知識逮壁,快速入門孵坚。而那其余的80%等到需要的時候再回去查也不遲。
像我一開始學習技術窥淆,幾十集教學視頻卖宠,一集集地看,每一集的實例都去實現(xiàn)一遍忧饭,結果花了一個多月才學完了課程扛伍。而在投入工作后才發(fā)現(xiàn)很多東西不常用,而且真到用的時候基本上也忘了也是要靠查資料才可以完成任務的词裤。所以刺洒,重要的東西要重點學,其他東西了解大概吼砂,到用的時候知道有這么回事逆航,知道怎么查就好~
在這個技術變化極快的時代,每一門技術都不知道何時會被淘汰渔肩,所以我覺得程序員的最大財富在于學習能力和解決問題的能力因俐,而非技術本身。所以呢,堅持不斷地去學習和奮斗才能不被這個快速發(fā)展和變化的時代所淘汰啊~之后我會實踐更多學習新技術的過程抹剩,從中總結出一套快速學習新技術的方法來撑帖。

關于我

VioletJack,移動澳眷、前端工程師胡嘿,兩年移動端工作經(jīng)驗、一年前端工作經(jīng)驗【嘲現(xiàn)專注于全棧開發(fā)灶平、效率管理、學習方法的學習箍土。會定期產(chǎn)出關于Android逢享、Vue、移動前端相關的博文吴藻。歡迎大家關注我瞒爬,我會用心維護和經(jīng)營好博客,多產(chǎn)出高質(zhì)量文章沟堡。同時也希望我所寫的東西可以幫到有需要的朋友侧但。
新浪微博: http://weibo.com/u/2640909603
掘金:https://gold.xitu.io/user/571d953d39b0570068145cd1
CSDN: http://blog.csdn.net/violetjack0808
簡書: http://www.reibang.com/users/54ae4af3a98d/latest_articles
Github: https://github.com/violetjack

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市航罗,隨后出現(xiàn)的幾起案子禀横,更是在濱河造成了極大的恐慌,老刑警劉巖粥血,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件柏锄,死亡現(xiàn)場離奇詭異,居然都是意外死亡复亏,警方通過查閱死者的電腦和手機趾娃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來缔御,“玉大人抬闷,你說我怎么就攤上這事「唬” “怎么了笤成?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長眷茁。 經(jīng)常有香客問我疹启,道長,這世上最難降的妖魔是什么蔼卡? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任喊崖,我火速辦了婚禮挣磨,結果婚禮上,老公的妹妹穿的比我還像新娘荤懂。我一直安慰自己茁裙,他們只是感情好,可當我...
    茶點故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布节仿。 她就那樣靜靜地躺著晤锥,像睡著了一般。 火紅的嫁衣襯著肌膚如雪廊宪。 梳的紋絲不亂的頭發(fā)上矾瘾,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天,我揣著相機與錄音箭启,去河邊找鬼壕翩。 笑死,一個胖子當著我的面吹牛傅寡,可吹牛的內(nèi)容都是我干的放妈。 我是一名探鬼主播,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼荐操,長吁一口氣:“原來是場噩夢啊……” “哼芜抒!你這毒婦竟也來了?” 一聲冷哼從身側響起托启,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤宅倒,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后屯耸,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體唉堪,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年肩民,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片链方。...
    茶點故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡持痰,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出祟蚀,到底是詐尸還是另有隱情工窍,我是刑警寧澤,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布前酿,位于F島的核電站患雏,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏罢维。R本人自食惡果不足惜淹仑,卻給世界環(huán)境...
    茶點故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧匀借,春花似錦颜阐、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至是鬼,卻和暖如春肤舞,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背均蜜。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工李剖, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人兆龙。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓杖爽,卻偏偏與公主長得像,于是被迫代替她去往敵國和親紫皇。 傳聞我的和親對象是個殘疾皇子慰安,可洞房花燭夜當晚...
    茶點故事閱讀 45,691評論 2 361

推薦閱讀更多精彩內(nèi)容