Node.js 入门学习
Nodejs 简介
什么是Nodejs?
一、Node.js 不是一门语言,不是库和框架,nodejs可以帮助我们打开服务器这个黑盒子,去访问数据库获取或存储数据,使用的是js语言更快上手。
二、Node.js 是一个JavaScript运行时环境(平台)也就是说Node.js可以解析和执行JS代码,以前只有浏览器能够解析执行JS,使用Node可以脱离浏览器来运行
浏览器与Node.js 中的JavaScript区别
1、浏览器中的JS
(1)EcmaScript
-
基础语法
-
if、var、function、Object、Array等
-
DOM和BOM
2、Node.js中的JS
(1)EcmaScript(没有DOM和BOM,服务端不操作页面)
(2)在Node中为JavaScript提供了一些服务器级别的API
-
文件读写
-
网络服务的构建
-
http服务器等
Nodejs的特性
-
event-driven 事件驱动
-
non-blocking I/O model 非阻塞IO模型(异步API)
-
lightweight and efflclent 轻量和高效
ip地址和端口号
1、ip地址:是用来定位计算机的
- 客户端访问服务端:比如客户端访问www.baidu.com网站,浏览器不认识网址,是通过百度他的服务器IP地址,DNS解析成对应网站的;
- 服务端返回响应数据给客户端:服务器会自动识别客户端的ip地址和端口号,返回数据
2、端口号是用来定位具体的应用程序(软件)告诉服务器,客户端是在哪个软件上交互
所有需要联网通信的应用程序都会占用一个端口号
Node.js 模块化开发
Node的核心模块
node提供的服务器级别的API,绝大多数都是封装在一个个具名的模块
中的,所以我们要使用时,通过require先引入这个核心模块就能使用了,例如fs(文件读写功能)
Node的模块系统(用户自定义模块)
node每次只能操作一个js文件,如果想同时操作多个js文件该怎么做呢?
1、require 方法
(1)加载模块并执行里面的代码
(2)拿到被加载文件,所导出的接口对象(exports)
2、exports 对象
在每个文件模块中都提供了一个对象exports,默认是一个空对象,我们要做的就是把需要导出到外部的内容赋给这个exports对象,外部就可以访问了。
例:
(1)a.js文件引入b.js文件:var ret = require('./b.js'); console.log(ret.foo) ==> hello
(2)b.js文件中导出需要外部访问的内容,通过exports对象实现:exports.foo = 'hello'
第三方模块
Nodejs的常用API
一、文件读写 fs模块
1、读文件 fs.readFile
- 使用require引入fs模块(file-system)文件系统
var fs = require(' fs ')
- 通过fs.readFile方法来读取文件
参数一:读取的文件路径
参数二:回调函数,携带error和data参数,成功读取时data返回二进制的数据,需要通过toString方法转换成我们认识的字符,失败返回error信息
fs.readFile( ' 路径 ',function( error,data ) {
if (data) {
console.log( data.toString() ) ==> 二进制转换成我们能看懂的字符
} else { console.log(error) }
})
2、写文件 fs.writeFile
参数一:写(创建)文件的路径以及起个文件名,./data/你好.js
参数二:写入的内容
参数三:回调函数,函数只有一个参数err,因为只是写文件,返回写入是否成功即可,没有返回数据需要获取
fs.writeFile( ’ 路径 ‘,’ 写入的内容 ',回调函数( err错误信息 ) )
fs.writeFile( ' ./data/src/你好.js ',' 大家好,我是写文件 ',function( err ) {
if ( err ) { console.log( err ) }
} )
3、读取目录下所有文件夹名 fs.readdir
fs.readdir('目录路径', function(err, files) {
if(err) {
return response.end('Can not find')
}
console.log(files);
})
二、HTTP搭建服务器
1、加载http核心模块
var http = require ( ' http ' )
2、使用http.createServer()方法创建Web服务器,返回一个Server实例
var server = http.createServer()
3、服务器要干嘛:
接收请求、发送响应
① 注册监听 request
请求事件,收到客户端发送过来的请求时触发
② 执行第二个参数:回调函数function(请求对象request,响应对象response)
server.on('request', function(request, response) { }) // 给实例出来的Server 监听请求事件
request请求对象
可以获取客户端的请求信息,例如路径 request.url
response响应对象
(1)设置响应数据的类型
在http协议中,Content-Type是用来告知对方,我所发送的数据内容是什么类型
在服务端发送的响应数据,默认是万国码utf-8的,需要告知客户端的浏览器数据内容的类型,才不会出现乱码的情况
response.setHeader('Content-Type', 'text/plain或html; charset=utf-8')
Content-Type
: 设置数据内容类型 charset
:字符编码类型为utf-8
text/plain
:表示数据是普通的文本 text/html
:表示数据是html格式的文本,转义标签
image/jpeg
:表示数据是图片,图片不需要设置字符编码
更多类型参考HTTP Mine-type,不同扩展名的资源对应不同类型
(2)发送响应数据的方法 end
response.write
方法可以发送响应数据,可使用多次,必须使用response的end方法结尾,告诉客户端,我响应完了。也可以直接使用response.end
方法发送响应数据,因为一般只需要发送一次就够了,方便简洁
// on 监听request请求事件 调用回调函数
server.on('request', function(request, response) { // request 请求对象 response 响应对象
console.log('收到客户端发送过来的请求,请求路径是:' + request.url);
// 不同路径 返回不同响应数据
if (request.url === '/') {
response.setHeader('Content-Type', 'text/plain; charset=utf-8')
response.end('index 普通文本')
} else if(request.url == '/content') {
response.setHeader('Content-Type', 'text/html; charset=utf-8')
response.end('<h1> 我是HTML!</h1>')
}
// 返回的数据只能是字符串或者二进制 可以通过JSON的stringify方法转换成字符串
var data = [{
name : 'xiaoming',
age : 18
}, {
name : 'xiaohua',
age : 18
}]
if (request.url === '/list') {
response.end(JSON.stringify(data))
}
})
4、绑定端口号,启动服务器(端口号是实现网络通信的)
server.listen(3000,function(){})
发送文件中的数据
实际开发中,我们都是把html、css、js、img等资源放在一个单独的文件夹中 (可能在项目中,也可能在其他盘里,如C盘里面有个WWW文件夹专门放资源,都可以填写对应路径去读取:C:/xxxx),然后我们在服务器里面去读取里面的数据资源,具体实现如下 👇
- 引入fs读写文件模块,通过request请求对象中的url方法判断用户访问的页面
- 通过
fs.readFile()
方法去读取对应的html中的数据 - 根据文件数据内容的类型,设置好对应类型(参考HTTP Mine-type)再发送响应数据给客户端浏览器