vivian blog

Nodejs框架归类

前言

前些天一直在youtube逛nodejs的教程,然后我发现了ninjas这个教程,里面的视频内容很赞哦,比较全面的介绍了nodejs的内容,从对文件的操作,到express,nodemon,body-parser等框架的应用场景,以及Middleware的概念让我受益匪浅,现在让我粗略总结一下关于nodejs的东西吧

nodejs是什么

nodejs是基于google chrome v8 engine写的c++程序,它是javascript应用服务器端的语言

npm 模块管理包

以下,我主要讲述npm的一些指令,而不是讲述其底层的工作原理,鉴于我知识面的限制。

  • npm i express 安装express模块
  • npm i express -g 全局安装express模块,并express写入环境变量,这样在全机都可以运行express模块
  • npm i express -save 安装express模块,并将此依赖保存在package.json文件中
  • npm uninstall express 写在express模块,注意package.json文件中并不会将对应的dependencies删除
  • npm install 此时会查找你的package.json文件中的dependencies,并将里面的模块都安装在你所在的目录之下

对象的继承

nodejs中的inherits方法,能够让一个对象继承另一个对象的属性(底层操作应该也是复制对象),i.e

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
var events = require('events'),
util = require('util');
var Person = function (name) {
this.name = name;
}
util.inherits(Person,events.EventEmitter);
var james = new Person('james');
var mary = new Person('mary');
var ryu = new Person('ryu');
var people = [james,mary,ryu];
//person就已经继承了eventEmitter中的特性
people.forEach(function (person) {
person.on('speak',function(msg){
console.log(person.name+' said: '+msg);
});
});
james.emit('speak','hey dudes');

文件操作

mkdirSync是创建folder的同步操作,这是阻塞性的操作。
rmdirSync是删除folder的同步操作

mkdir, 基于nodejs是单线程,非阻塞的工作模式,故其是非阻塞式的异步操作,i.e.

1
2
3
4
5
var fs = require('fs');
var file = fs.readFile('input.txt','utf8',function(err,data){
fs.writeFile('writeme.txt',data);
console.log(data);
});

rmdir,删除folder的异步操作

unlink 删除file

writeFile先创建文件,再写字符串进去(string/stream),如果是json格式,则需要json.stringify()来将该对象转换为字符串
同理readFile则是读文件,他们都具有异步和同步两种方法

stream & buffer

stream 是对buffer的高级封装,其操作的底层仍是buffer对象

buffer 是数据缓存对象,类似数组对的数据结构,其主要作用是

将少量的数据存储在buffer中,当buffer中的数据已经装满后,就将其运输到目的地,然后,再重新前面的步骤,知道所有的数据都运输完成为止

现在让我先创建一个myReadStream出来

1
2
3
4
5
6
7
var myReadStream = fs.createReadStream(__dirname+'/readMe','utf8');
var myWriteStream = fs.createWriteStream(__dirname+'/writeMe.txt');
myReadStream.on('data',function (chunk) {
console.log('new chunk received.');
myWriteStream.write(chunk);
});

pipe

另一种更加简洁的写法是使用pipe,其原理与上面的所写的差不多

1
myReadStream.pipe(myWriteStream);

express 快速处理不同的路由/跳转到不同的url

说到路由,现在列出http的方法

  • app.listen(3000);
  • app.get(‘route’, fn);
  • app.post(‘route’, fn);
  • app.delete(‘route’, fn);
1
2
3
4
5
var app = require('express')();
app.get('/',function (req,res) {
res.send('this is the home page');//注意这里只能传入字符串和stream流;
//如果想要传入json对象,要使用json.stringify()转换成字符串
});

然后另一种是动态的路由 route param

1
2
3
4
//:id是url传入的参数
app.get('/profile/:id',function (req,res) {
res.send('you requested id' + req.params.id);
});

ejs template

ejs是一个模板引擎用来渲染动态的html

1
app.set('view engine','ejs');//设置view层的模板引擎为ejs

<% %>这是ejs的语法,而它的参数通常是通过ajax来获取的,另外一种表达式则是<%= %>

而后台的传送则是通过

1
2
3
app.get('/profile/:name',function (req,res) {
res.render('profile',{person:req.params.name});//第二个参数则是传输的参数
});

ejs还有另外一种语法,而此语法有助于模块化的开发

1
<% include partials/nav.ejs %>

这样子就相当于将nav封装在nav.ejs中,而其他页面若想要调用可以直接写上这条代码即可

middleware

middleware的含义便是中间件,可以解释为将具体业务与底层逻辑解耦的组件,目前我所接触到的middleware有body-parser,express中的static方法

  • express.static是用于共享资源的,比如说,当你在ejs文件当中引入了一个css文件,然后你在localhost中无法访问到那个css文件,这说明在服务器的文件结构并不像你本地文件的结构,所以此时就可以向服务器指定你资源的准确位置,这样ejs才能访问到你的css文件,代码如下

    1
    2
    3
    app.use('/assets',express.static('asstets'));
    //注意即便你将你本地那个文件重命名,你再浏览器中访问/assets,仍然能够访问到那资源
    //注意第一个就是你所指定的路由
  • body-parser
    body-parser是一个请求体解析中间件,在实际应用中,不同路径(路由)可能会要求用户所以不同的内容类型,body-parser还支持为单个express路由添加请求体解析:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    var express = require('express'),
    bodyParser = require('body-parser'),
    app = express(),
    //创建application/json解析
    jsonParser = bodyParser.json(),
    //创建application/x-www-form-urlencoded解析
    urlencodedParser = bodyParser.urlencoded({extend:false});//extend不知道是什么
    //POST/login 获取url编码的请求体
    app.post('/login',urlencodedParser, function (req,res) {
    //req.body获取请求体
    if(!req.body) return res.sendStatus(400);
    res.send('welcome, '+req.body.username);
    });
    //POST /api/users获取json编码的请求体
    app.post('/api/users',jsonParser,function (req,res) {
    if(!req.body) return res.sendStatus(400);
    //create user in req.body
    })

nodemon 监控框架

nodemon可用于监控文件是否有所改动,后台js文件有所改动,nodemon都会重启node,然后直接在浏览器就可以浏览到已经修改的结果,若改动的是前端的js文件,则需要使用rs指令来重启服务器,nodemon app.js是运行app.js文件的指令

mongodb & mongoose

看到mongodb和mongoose发现,这真的是很简洁的创建数据库,以及操作数据库的方式,比起oracle来说,真的简单许多
现在来说一下mongodb在云端上的存储mlab。