node.js介绍
node.js是什么
- node.js不是一门语言
- node.js不是库或者框架
- node.js是JS运行时环境
- 简单来讲JS可以解析和执行JS代码
- 以前只有浏览器可以来解析和执行JS代码,现在可以脱离浏览器来运行,归功于node.js
- 构建于chrome v8引擎,代码只是具有特定格式的字符串,引擎可以认识它,帮你去解析和执行。v8引擎执行JS代码最快
浏览器中的JS
- ECMAScript语法
- DOM
- BOM
node.js中的JavaScript
- 没有BOM和DOM(因为服务器不操作页面)
- ECMAScript语法
- 为JS提供一些服务器级别的操作API
- 文件读写,fs核心模块
- 网络服务的构建,http核心模块
- 网络通信
- 等等
node.js的特点
- 事件驱动
- 非阻塞I/O模型(异步)
- 轻量级,高效
- node.js包npm是世界上最大的生态系统开源库
node.js能做什么
- web服务器后台
- 命令行工具
- 游戏服务器
参考资料
- CNODE社区:http://cnodejs.org
学习内容
- B/S编程模型
- 模块化编程
- node常用API
- 异步编程
- Express开发框架
- EcmaScript 6
node.js功能
文件读写功能
fs是file-system的缩写,node想要操作文件,必须先引入fs这个核心模块。
- 读文件
- 使用require方法加载fs核心模块
var fs = require('fs')
- 使用fs.readFile()方法读取文件。两个参数,一个是文件路径,一个是回调函数。**一定要注意,回调函数里的data返回的是二进制数据,所以要将data转为string对象。**另外,这个方法可以读取任何类型的文件,比如html,img等
fs.readFile('.file/index.html',function(error,data){
if (err){
return console.log('not found')
} else {
console.log(data.toString())
}
})
- 写文件
- 使用require方法加载fs核心模块
var fs = require('fs')
- 使用fs.writeFile()方法读取文件。三个参数,一个是文件路径,一个是写入的文件内容,一个是回调函数。回调函数只有一个参数就是error。注意,写入的内容会覆盖文件之前的内容
fs.writeFile('.file/index.html','hello world',function(error){
if (err){
return console.log('写入失败')
} else {
console.log(‘写入成功)
}
})
- 加载http核心模块
var http = require('http')
- 创建一个web服务器
var server = http.createServer()
- 接收请求,设置请求处理函数处理请求。server.on(‘request’,回调函数)。回调函数有两个参数,request和response,response通过res.write()来给客户端发送响应,必须以res.end()结尾。注意,如果返回的是中文会出现乱码的现象。因为中文计算机操作系统默认编码语言是gbk而浏览器是utf-8.所以需要通过res.setHeader,Content-Type来告诉浏览器我返回的数据的语言编码
server.on('request',function(req,res){
res.setHeader('Content-Type','text/plain; charset=utf-8')
res.end('收到客户端的请求了')
- 开启服务器。server.listen(端口号,回调函数)。注意,如果改了代码,要重启服务器。
注意,ip地址是用来定位计算机的,而端口号是用来定位具体的应用程序的,所有需要联网通信的软件都需要端口号
server.listen(3000,function(){
console.log('服务器开启了,可以通过http:127.0.0.1:3000来进行访问')
除了读写文件和服务器功能,node.js还有其他一些核心模块可以用require来加载方便我们使用。在弄得中,模块有3种
- 具名的核心模块
- 用户编写的自定义模块
- 第三方模块
用户自定义模块
通过require(自定义模块路径)来加载自定义模块。但是在node中,没有全局作用域,只有模块作用于,那如何让模块与模块之间进行通信?**每个文件模块都提供一个对象exports(空对象)将需要被外界访问的成员改在到exports上。
//这是我的主文件a.js,需要引用b.js
var b = require(./b.js)
console.log('我的名字是' + b.name)
console.log(b.add(2,3))
//这是我的自定义模块b.js
exports.name = 'xiaobai'
exports.add = function(x,y){
return x + y
}