MEAN Stack - Intro MongoDB and Node.js

该文章为网络课 Introduction to MongoDB using the MEAN Stack学习笔记。

1. MEAN Stack

The MEAN stack is MongoDB, Express.js, Angular, and Node.js. Because all components of the MEAN stack support programs are written in JavaScript, MEAN applications can be written in one language for both server-side and client-side execution environments.

MongoDB:数据库
Express.js:Web app
Angular.js:前端
Node.js:后端

2. MongoDB

2.1 基本

属于NoSQL的一种,存储的是一种类JSON文件,即BSON(Binary JSON),包含JSON并不限于JSON。

2.2 命令

  • mongod -> 启动数据库服务器
mongod --dbpath ~/data/db/
  • mongo -> 启动数据库shell界面
mongo

待学习...

3. npm

Node Package Manager是专门用来管理node.js项目的软件。设计者通过定义一个package.json文件,就可以管理好许多关于项目的信息,包括项目基本信息(版本,作者,描述),项目依赖的包信息,项目测试等等。

比如,举例如下的package.json

{
  "scripts": {
  "test": "mocha test.js",
  "test-kitten": "mocha -R nyan test.js",
  "watch": "gulp watch"
  },
  "dependencies": {
    "underscore" : "1.5.2",
    "mongodb" : "2.0.35",
    "mocha" : "2.2.4"
  },
  "devDependencies": {
    "gulp": "3.8.11",
    "gulp-mocha": "2.0.1",
    "mocha": "2.2.4"
  }
}

3.1 "dependencies"

通俗来讲,就是一个定义了项目中要依赖的其他package。npm拥有许多开源的包,可供设计者使用,大大简化了设计。
设计者只需要在package.json中列出所要用的包以及它们对应的版本, 然后在命令行中执行:

npm install

项目所需要的包即可下载到本地,项目中即可通过require()语句来引用要用的包。

var mongodb = require('mongodb');
var assert = require('assert'); //node.js内置包

3.1 “scripts”

通过在此定义一些npm的命令来提高开发的效率。
比如:
npm test 相当于执行node_modules/.bin/mocha test.js,该mocha包用来对项目进行测试。
test.js文件中定义了一些测试程序:

var assert = require('assert'); /引用build-in的评估包

describe('my feature', function() { //定义一个名为'my feature'的testcase
  it('works', function() {
    assert.equal('A', 'A'); //评估'A'是否等于'A'
  });

  it('fails gracefully', function() {
    assert.throws(function() { //如果assert的评估有错误
      throw 'Error!';
    });
  });
});

describe('my other feature', function() {
  it('async', function(done) {
    setTimeout(function() {
      done();
    }, 25);
  });
});

npm run watch(不要忘记run)相当执行./node_modules/.bin/gulp watch,该gulp包下的gulp-mochaplugin包用来对mocha测试进行封装。此外,更强大的地方在于还可以进行自动测试,当它运行时,自动检测项目中的文件的改动,一旦有改动,自动运行测试。需要定义一个如下的gulpfile.js文件

var gulp = require('gulp'); //引用gulp core
var mocha = require('gulp-mocha'); //引用gulp的mocha plugin

gulp.task('test', function() { //定义一个名叫'test'的gulp测试任务
  gulp.
    src('./test.js'). //该测试任务包含test.js中的所有testcase
    pipe(mocha()). //在此体现对mocha的封装:实际上调用mocha包来测试
    on('error', function(err) {
      this.emit('end');
    });
});

// watching specific file's changing
gulp.task('watch', function() { //定义一个名叫watch的gulp自动测试任务  
  gulp.watch('./*.js', ['test']); //对所有.js文件的改动进行检测,一旦有改动,执行之前定义的名为'test'的gulp任务
});

4. node.js

4.1 与mongoDB的连接

var mongodb = require('mongodb');
var uri = 'mongodb://localhost:27017/example';

//.MongoClient.connect is used for connecting to the database
mongodb.MongoClient.connect(uri, function(error, db) {
  if (error) {
    console.log(error);
    process.exit(1);
  }

  //.collection is used for connectting a collection
  //.insert is used for inserting data
  db.collection('sample').insert({ x: 1 }, function(error, result) {
    if (error) {
      console.log(error);
      process.exit(1);
    }

    // .find() need to be chained with .toArray() to get the actual data
    // using .find() to qeury documents whose attr "attrName" is "abc"
    db.collection('sample').find(attrName : "abc").toArray(function(error, docs) {
      if (error) {
        console.log(error);
        process.exit(1);
      }

      console.log('Found docs:');
      docs.forEach(function(doc) {
        console.log(JSON.stringify(doc));
      });
      process.exit(0);
    });
  });
});

4.2 关于Node.js的concurrency与event loop

其实这也是javascript不同于java或c++等语言的方面。
javascript支持一种叫做call back function的函数参数形式。该function只有在函数的操作被正常执行后才执行,否者常常有对错误的处理。这个性质也叫作asynchronous

可以理解为,javascript的各种函数是在一个叫event loop的函数里执行,如下图:

event loop

之所以这么说,是因为javascript的解释器是在一个loop里不断运行的,它不断地用于监听event,之后再对监听到的event进行处理。

有趣之处在于,这个event loop是single thread,意味着任何时候程序只能处理一个event,处理完这一个再处理下一个,相当于一个queue

因此,javascript实际上就是在执行一个又一个的event handler,当前这个event handler又可以register另一个event handler(设置对另外某个event的监听)。

举个🌰:

setTimeout(function() {
  console.log('In timeout!');
}, 0);

console.log('Not in timeout');

“Not in timeout” 会先与 “In timeout!”输出。
原因是,当前这个event loop中,setTimeout register了一个event handler,它的功能是输出"In timeout"。但是这个event得在下一次iteration of event loop中才能得到执行。而输出"Not in timeout"属于当前iteration of event loop,因此可以输出。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容

  • topics: 1.The Node.js philosophy 2.The reactor pattern 3....
    宫若石阅读 1,052评论 0 1
  • That everyone’s too busy these days is a cliché. But one ...
    苏醒7阅读 605评论 0 0
  • 当你的才华还撑不起你的野心时,你就应该静下心来学习;当你的能力还驾驽不了你的目标时,你就应该沉下心来历练;只有拼出...
    魏氏陌小浅阅读 328评论 0 1
  • 今日三八,昨天就有熟悉的朋友发来祝福:三月七日是美美哒女生节。 节日快乐哦(⊙o⊙) 心中顿时满满的少女心爆棚,原...
    mellisa_901阅读 312评论 0 1