Node.js + MongoDB 后端学习笔记

学习后端有两个礼拜了。当然,实际学习时间不过三四天,但感觉入门木有问题了,起码我的目标:为前端提供数据支持已经没有问题了。其他复杂的逻辑和数据处理就等需要的时候边学边做吧。
在这里主要总结和探讨下后端知识以及如何更快的掌握一门新技术。

Node.js学习

学习目标:为前端提供 RESTful API 接口。

Node方面,我快速浏览一遍基础教程,对很多知识点都是了解即可。主要是关注在写 RESTful 接口这一块的知识点:

  • 全局对象 —— 了解node中经常出现的全局对象是必要的。
  • 常用模块 —— 对出现频率搞得模块要熟悉的,如 fs、http、util 等
  • GET、POST 请求和 RESTful API —— 这是我的主要学习目标,认真看完并且照着示例代码实现一遍。
  • Express 框架 —— 已知的比较适合新手学习的node框架,熟悉基本用法,照着实现一遍。
  • 连接 MongoDB —— 学习如何连接MongoDB,这个在学习了MongoDB基本知识后重点学习。

因为暂时只为了提供接口,所以只要对Node有个大致的了解。然后重点关注写接口、数据库和框架。当我看完一遍资料,并将重点的知识点实际操作实现一遍之后,我对 node 就有了大致了解了~达到了给我一个 Node 后端项目我能看懂大部分代码逻辑的程度。之后看一下 Express 框架~

Express

学习目标: 使用 Express 快速搭建 Node 后端项目,配合之前学到的 Node 基础知识为前端提供 API 接口支持

这里把 Express 的官方文档API看了一遍,发现呢其实 Express 的东西不多,在看过node基本知识后还是很好理解的。
我就用了 Express 提供的应用生成器生成一个 Express 项目。项目很简单,主要是修改 app.jsroutes 文件夹里面的东西,写法与Node教程里的差不多。在终端执行 $ npm start 命令即可进行调试。
一开始我还没学习MongoDB的时候我是用的JSON文件来存取数据的下面是我写的一段代码

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

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

// 获取所有数据
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 文件,这样就实现了使用 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": "宝宝要吃饭" }
 ]

调试过程建议使用Postman,调试各类接口都特别方便。

数据库

学习目标:了解 MongoDB 基本知识,重点掌握数据的增删改查和 MongoDB 与 Node.js 的连接

接下来转战数据库,这里选择了 MongoDB 。在明确了学习目标之后,重点学习增删改查和数据库连接,其他的以了解为主。就在这样的目标之下,重点学习以下知识:

  • 安装、创建数据库以及数据库的一些常用操作。
  • 找到一个好的数据库 GUI —— 发现了 Robomongo,感觉挺好用的。
  • 创建、删除数据库。
  • 插入、更新、查询、删除文档 —— 这当然是重中之重,所有示例逐个实现一遍
  • 除此之外,想数据处理、比较、数据数量限制limit、排序sort等了解即可,需要的时候查阅一下就可以解决问题。

配合Node里面的 Node.js MongoDB 章节,动手实践连接后端与数据库了。照着教程来连接成功应该不难。成功在 Express 项目中获取到数据库数据就说明连接成功了。现在就可以开始你的表演了!
除了GET和POST,另外两个请求的写法差不多,DELETE类似GET方法,而PUT类似POST方法。
哦,对了,数据库和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

// 创建 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': '未找到相应数据' })
            }
            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'// 数据库地址

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())

关于学习效率

学习后端和数据库实际就花了三四天吧,感觉自己学习效率还是可以的。分享下我的学习方法。

  • 明确学习目标,学习始终围绕着目标来。
  • 快速浏览学习资料,找出与学习目标有关的资料重点学习。
  • 使用番茄时间工作法,将专注集中到一个时间段上,劳逸结合。不推荐一口气看三四个小时,效率会低下的。
  • 学习技术必须边看资料,边敲代码。木有实践的知识难以理解也不容易被记住。
  • 写博客、笔记记录总结学到的知识点。学会和能教是两种境界。

总的来说,我感觉学习新技术首先是要有个目标——学习这门新技术目标是什么?然后根据目标来学习。先快速浏览筛选出能帮我们实现目标的知识,然后抓重点学习。这样学习才能够快速掌握一门知识。书上说过:一本书只有20%的知识是常用的,只要掌握了这20%就可以运用这项知识了,所以我们要根据目标找准那20%的知识,快速入门。而那其余的80%等到需要的时候再回去查也不迟。
像我一开始学习技术,几十集教学视频,一集集地看,每一集的实例都去实现一遍,结果花了一个多月才学完了课程。而在投入工作后才发现很多东西不常用,而且真到用的时候基本上也忘了也是要靠查资料才可以完成任务的。所以,重要的东西要重点学,其他东西了解大概,到用的时候知道有这么回事,知道怎么查就好~
在这个技术变化极快的时代,每一门技术都不知道何时会被淘汰,所以我觉得程序员的最大财富在于学习能力和解决问题的能力,而非技术本身。所以呢,坚持不断地去学习和奋斗才能不被这个快速发展和变化的时代所淘汰啊~之后我会实践更多学习新技术的过程,从中总结出一套快速学习新技术的方法来。

关于我

VioletJack,移动、前端工程师,两年移动端工作经验、一年前端工作经验。现专注于全栈开发、效率管理、学习方法的学习。会定期产出关于Android、Vue、移动前端相关的博文。欢迎大家关注我,我会用心维护和经营好博客,多产出高质量文章。同时也希望我所写的东西可以帮到有需要的朋友。
新浪微博: http://weibo.com/u/2640909603
掘金:https://gold.xitu.io/user/571d953d39b0570068145cd1
CSDN: http://blog.csdn.net/violetjack0808
简书: http://www.jianshu.com/users/54ae4af3a98d/latest_articles
Github: https://github.com/violetjack

    原文作者:VioletJack
    原文地址: https://www.jianshu.com/p/76ffc489f674
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞