nodejs 模块

对nodeJS早有耳闻,但是一直迟迟没有对它下手,虽然在项目中有用过nodejs,但也没有系统的学习过,这次我们就来探究一下。

node.js是什么东西?

  • nodejs是以chrome v8为运行环境的一个平台,它不是一门语言,而是一个平台
  • nodejs致力于是构建速度快,稳定的网络程序更简单
  • 它具有事件驱动和非阻塞I/O的特色,使之轻量级并且高效率
  • 它非常适合在分布式设备运行数据密集型实时应用程序

讲到这里,我们大概的明白了nodejs是一个平台,是一个环境,它是由chrome v8引擎来做底层支持,使用JavaScript来做语言支持,大概意思就是我们之前使用JavaScript运行在浏览器端去处理dom,bom操作等等,现在JavaScript运行在服务器去处理数据的增删改查,接受请求,发送数据,查找修改文件。
JavaScript以前是在浏览器端跑,现在有了nodejs就可以在后端跑,就像汽车原本只能在公路上跑,现在你给他装了nodejs,它现在可以在水里跑了一样.

安装开发环境

1.官网下载nodeJS安装包
2.在下载完安装包后,按照默认程序安装。
3.检验是否安装成功,打开命令提示符,输入node – v,如果正常就会出现版本号的输出。
在安装nodejs时,也一并安装了npm, 命令行输入npm -v 查看npm版本。
这样环境就已经搭建完成,很简单。
接下来我们就来了解一下nodejs的基础知识

模块

Node应用是由模块组成的,Node遵循了CommonJS的模块规范,来隔离每个模块的作用域,使每个模块在它自身的命名空间中执行
Node.js 提供了 exports 和 require 两个对象,其中 exports 是模块公开的接口,require 用于从外部获取一个模块的接口,即所获取模块的 exports 对象。
创建一个模块

1
2
3
4
5
6
7
8
9
10
11
//hello.js 
function Hello() {
var name;
this.setName = function(thyName) {
name = thyName;
};
this.sayHello = function() {
console.log('Hello ' + name);
};
};
module.exports = Hello; // 暴露出去,其他文件可以引入这个模块

引入这个模块

1
2
3
4
5
//main.js 
var Hello = require('./hello'); // 引入hello文件
hello = new Hello();
hello.setName('BYVoid');
hello.sayHello();

这是我们自己写的一个简单的模块,nodejs还提供了一些原生的模块,如http、fs、path等,都是可以直接引入使用的,这些我们后面再介绍。

fs 处理文件的模块

fs模块用于对系统文件及目录进行读写操作

理解同步和异步方法

模块中所有方法都有同步和异步两种形式(异步方式主要是使用回调函数) , 例如读取文件内容的函数有异步的 fs.readFile() 和同步的 fs.readFileSync()。异步的方法函数最后一个参数为回调函数,回调函数的第一个参数包含了错误信息(error)。
建议使用异步方法,比起同步,异步方法性能更高,速度更快,而且没有阻塞

readFile读取文件

fs.readFile(filename,[option],callback) 方法读取文件。

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
var fs = require('fs'); // 引入fs模块
// 异步
fs.readFile('./1.txt', 'utf-8', function(err, data) {
// 读取文件失败/错误
if (err) {
throw err;
}
// 读取文件成功
console.log('utf-8: ', data);
});

// 同步
fs.readFileSync('./1.txt','utf-8')。

WriteFile写入文件

使用fs.writeFile(filename,data,[options],callback)写入内容到文件。

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var fs = require('fs'); // 引入fs模块

// 写入文件内容(如果文件不存在会创建一个文件)
//配置参数flag:
/*
* a :追加
* w :写入
* r :读取
* */
fs.writeFile('./2.txt', 'hello', { 'flag': 'a' }, function(err) {
if (err) {
throw err;
}
console.log('成功');
});

// 同步只是去掉回调函数

文件删除

1
2
3
4
5
6
7
8
9
10
// 异步
fs.unlink("2.txt",function (err) {
if(err){
return console.log(err)
}else {
console.log("删除成功")
}
})

// 同步只是去掉回调函数

目录操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 创建 new 目录
fs.mkdir('./new', function(err) {
if(err){
return console.log(err)
}else {
console.log('success.');
}
});

// 删除目录 ,只能删除空文件夹
fs.rmdir("./new",function (err) {
if(err){
return console.log(err)
}else {
console.log("删除成功");
}
})

http模块

对于NodeJS来说比较重要的一块就是http模块,我们使用http模块可以自己搭建服务器,从而监听客户端的一些请求,和客户端合作接受请求并且返回数据。

http模块搭建简易服务器

1
2
3
4
5
6
7
8
9
10
11
var http = require('http');

http.createServer(function(req,res){
res.writeHead(200,{
"content-type":"text/plain"
});
res.write("hello nodejs");
res.end();
}).listen(3000);

console.log('Server is running at http://127.0.0.1:3000/');

这就是一个简易的服务器,当然我们的业务场景肯定不会这么简单,下面继续扩展一下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
'use strict';

// 引入一些需要用到的模块
var
fs = require('fs'),
url = require('url'),
path = require('path'),
http = require('http');

// 从命令行参数获取root目录,默认是当前目录:
var root = path.resolve(process.argv[2] || '.');

console.log('Static root dir: ' + root);

// 创建服务器:
var server = http.createServer(function (request, response) {
// 获得URL的path,类似 '/css/test.css':
var pathname = url.parse(request.url).pathname;
// 获得对应的本地文件路径,类似 '/src/www/css/test.css':
var filepath = path.join(root, pathname);
// 获取文件状态:
fs.stat(filepath, function (err, stats) {
if (!err && stats.isFile()) {
// 没有出错并且文件存在:
console.log('200 ' + request.url);
// 发送200响应:
response.writeHead(200);
// 将文件流导向response:
fs.createReadStream(filepath).pipe(response);
} else {
// 出错了或者文件不存在:
console.log('404 ' + request.url);
// 发送404响应:
response.writeHead(404);
response.end('404 Not Found');
}
});
});

server.listen(3000);

console.log('Server is running at http://127.0.0.1:3000/');

pipe()管道方法自动读取文件内容并输出到HTTP响应

之后再来介绍里面具体的方法

感谢支持,我会不断进步