Node.js 笔记(一)
总结(上)
1.1 NodeJs介绍与使用
1.2 文件操作
1.2.1 file-system核心模块
- fs:file-system,在Node中如果想要进行文件操作,就必须引入fs这个核心模块。这个核心模块提供了所有的文件操作相关的 API
- 加载fs核心模块
//使用require加载fs核心模块
var fs = require('fs')
- 读取文件(fs.readFile)
- fs.readFile(‘文件路径/XX.txt’,回调函数(error,data){ })
- 两个参数:参数1即文件路径下的某个txt文件,参数2即回调函数传入error和data两个对象参数。
成功:
data中接收到的是数据
error中接收到的是null
失败:
data undefined没有数据
error 错误对象
//使用require方法加载fs核心模块
var fs = require('fs')
fs.readFile('./data/a.txt', function (error, data) {
// 我们需要通过toString方法
将文件的二进制码转为我们能认识的字符
// 在这里就可以通过判断 error 来确认是否有错误发生
if (error) {
console.log('读取文件失败了')
} else {
console.log(data.toString())
}
})
- 写文件(fs.writeFile)
- fs.writeFile(‘文件路径/XX文件’,‘写入内容’,回调函数(error,data){ })
成功:
文件写入成功
error 是 null
失败:
文件写入失败
error 就是错误对象
fs.writeFile('./data/你好.md', '大家好,给大家介绍一下,我是Node.js', function (error) {
if (error) {
console.log('写入失败')
} else {
console.log('写入成功了')
}
})
1.3 http核心模块
- 同样是用require方法加载核心模块http
var http = require('http')
- createServer()方法可以创建一个Web服务器,返回一个Server实例
var server = http.createServer()
- 让服务器执行一系列指令,server.on()接受两个参数:参数一请求对象request,参数二回调函数。
- 提供服务:对 数据的服务
- 发请求
- 接收请求
- 处理请求
- 给个反馈(发送响应)
- 注册 request 请求事件
- 当客户端请求过来,就会自动触发服务器的request 请求事件,然后执行第二个参数:回调处理函数
server.on('request', function () {
console.log('收到客户端的请求了')
})
- 绑定端口号,启动服务器server.listen()
server.listen(3000, function () {
console.log('服务器启动成功了,可以通过 http://127.0.0.1:3000/ 来进行访问')
})
- http实例server的on()方法,设置处理request事件的回调函数,该函数要传入require和response两个对象参数。
- 使用request.url可以获得用户请求的路径(即
www.baidu.com/获取这部分内容
)。response对象有一个方法write(),用于给客户端发送相应数据。
- 注:可以多次使用write,但最后必须用end来结束响应,否则客户端会一直响应。
- 这个例子无论访问哪个路径皆接收到helloworld
var http = require('http')
var server = http.createServer()
server.on('request',function(require,response){
console.log('收到客户端请求,请求路径是:' + request.url)
response.write('hello')
response.write('world')
response.end()
})
server.listen(3000,function(){
console.log('服务器启动成功了,可以通过http://127.0.0.1:3000/来访问')
})
- 根据不同请求路径返回不同数据: 要使用JSON.stringify()序列化才能传输(因为只认字符串和二进制码)
var http = require('http')
var server = http.createServer()
serve.on('request',function(req,res){
console.log('收到请求了,请求路径是' + req.url)
switch(request.url){
case '/index':
response.write('hello')
response.write('nodejs')
response.end()
break
case '/login':
var products = [{
name: '苹果 X',
price: 8888
},
{
name: '菠萝 X',
price: 5000
},
{
name: '小辣椒 X',
price: 1999
}
]
下一行代码是关键,序列化让网页能获取到这个数组
response.end(JSON.stringify(products))
break
default:
response.end('404 Not Found')
})
server.listen(3000,function(){
console.log('服务器启动成功,可以访问http://127.0.0.1:3000/')
})
res.end('hello world')
- 无论是write还是end,响应的只能是字符串,或二进制数。传入数值、中文什么都不行。JSON.stringify()即可。
response.write('hello')
response.write('world')
response.end()
可以替换成下边一行代码:
res.end('hello world')
1.4 Node中的模块
三种模块:
- 具名模块:例如fs、http;
- 用户自己编写的文件(js文件)模块;
require('./b.js')使用相对路径加载自定义模块
- 第三方模块
- 自定义的模块,require()是有返回值的,返回的是一个对象,该对象的属性和方法皆需要在请求的文件中使用exports.属性或方法来定义,默认是一个空对象。
a.js:
var bExports = require('./b')//默认bExports={}
//通过返回的对象bExport来使用它的属性和方法。
console.log(bExports.foo)//hello
console.log(bExports.add(10,10))//20
b.js:
var foo = 'bbb'
//利用exports.属性或方法来定义输出对象
exports.foo = 'hello'//{foo:'hello'}
exports.add = function(x,y){
return x+y
}
- 自我理解:require不管请求具名核心模块(fs、http)还是使用自定义文件(js文件)模块,都是通过require()来实例化,获取该具名模块或该文件模块的属性和方法
- 模块执行碰到require()就会执行对应的js文件,执行完后再跳回来。
a.js:
console.log('开始执行a')
require('./b.js')
console.log('结束执行a')
b.js:
console.log('开始执行b')
console.log('结束执行b')
打印结果:
开始执行a
开始执行b
结束执行b
结束执行a
- 模块是有模块作用域的,a.js用require执行b.js,在b.js中是用不了a.js定义的函数和变量。简单理解,超出文件外的函数和变量是不能调用的。
- require(’./b.js’)中‘./’是不能省略的,但b的后缀名是可以省略的。
1.5 常用核心模块
- fs、http、path、os(系统信息)。
- 加载具名核心模块用require()
总结(下)
2.1 http的一些内容
- require请求
- IP和端口号(80等等)
- ip 地址定位计算机
- 端口号定位具体的应用程序
- 过程:先输入网址,DNS解析为服务器的IP地址定位电脑(服务器),根据请求中的**端口号(浏览器自动处理)**确定服务器需要使用哪个具体的应用程序处理请求。
2.2 Content-Type(响应内容类型)
- 服务器响应的数据内容类型告诉客户端,而且要正确的告诉。否则它会按操作系统默认的去解析。
- 不同的资源对应的 Content-Type 是不一样,具体参照:http://tool.oschina.net/commons
- 对于文本类型的数据,最好都加上编码,目的是为了防止中文解析乱码问题
- 以上问题要使用setHeader()方法,参数1设置头部中的Content-type,参数2,文本类型,例如:‘text/html; charset=utf-8’。
var http = require('http')
var server = http.createServer()
server.on('request', function (req, res) {
var url = req.url
if (url === '/plain') {
// text/plain 就是普通文本
res.setHeader('Content-Type', 'text/plain; charset=utf-8')
res.end('hello 世界')
} else if (url === '/html') {
// 如果你发送的是 html 格式的字符串,则也要告诉浏览器我给你发送是 text/html 格式的内容
res.setHeader('Content-Type', 'text/html; charset=utf-8')
res.end('<p>hello html <a href="">点我</a></p>')
}
})
server.listen(3000, function () {
console.log('Server is running...')
})
- 通过网络发送文件
- 发送的并不是文件,本质上来讲发送是文件的内容
- 当浏览器收到服务器响应内容之后,就会根据 Content-Type 进行对应的解析处理
2.3 使用http发送本地资源文件夹
var fs = require('fs')
var http = require('http')
var server = http.createServer()
server.on('request',function(req,res){
//请求地址
var url = req.url
//根据请求地址,发送对应内容
if(url == '/'){
//访问首页读取文件
fs.readFile('./resource/index.html',function(err,data){
if(error){
//每次都要告诉浏览器发送的数据内容类型
res.setHeader('Content-Type', 'text/plain; charset=utf-8')
console.log('读取失败')
}else {
//此处要改为text/html,因为发送的是一个html文件
res.setHeader('Content-Type', 'text/html; charset=utf-8')
res.end(data)//其他类型值需要toString或JSON.stringify()
}
})
}else if(url == '/baby'){
//访问特定的页面
fs.readFile('./resource/ab2.jpg', function (err, data) {
if (err) {
res.setHeader('Content-Type', 'text/plain; charset=utf-8')
res.end('文件读取失败,请稍后重试!')
} else {
//传图片的时候,注意不要放入charset
res.setHeader('Content-Type', 'image/jpeg')
res.end(data)
}
})
}else{
res.setHeader('Content-Type', 'text/plain; charset=utf-8')
console.log('访问失败')
}
})
server.listen(3000,function(){
console('Server is running...')
}
2.4 Node 中的 JavaScript
- EcmaScript
- 变量
- 方法
- 数据类型
- 内置对象
- Array
- Object
- Date
- Math
2.5 模块系统
- 在 Node 中没有全局作用域的概念
- 在 Node 中,只能通过 require 方法来加载执行多个 JavaScript 脚本文件
- require 加载只能是执行其中的代码,文件与文件之间由于是模块作用域,所以不会有污染的问题
- 模块完全是封闭的
- 外部无法访问内部
- 内部也无法访问外部
- 模块作用域固然带来了一些好处,可以加载执行多个文件,可以完全避免变量命名冲突污染的问题
- 但是某些情况下,模块与模块是需要进行通信的
- 在每个模块中,都提供了一个对象:`exports`
- 该对象默认是一个空对象
- 你要做的就是把需要被外部访问使用的成员手动的挂载到 `exports` 接口对象中
- 然后谁来 `require` 这个模块,谁就可以得到模块内部的 `exports` 接口对象
- 还有其它的一些规则,具体后面讲,以及如何在项目中去使用这种编程方式,会通过后面的案例来处理
- 核心模块
- 核心模块是由 Node 提供的一个个的具名的模块,它们都有自己特殊的名称标识,例如
- fs 文件操作模块
- http 网络服务构建模块
- os 操作系统信息模块
- path 路径处理模块
- 。。。。
- 所有核心模块在使用的时候都必须手动的先使用
require
方法来加载,然后才可以使用,例如:
- 模块系统
- Node 中的其它的核心模块
- 做一个小管理系统:
- Express Web 开发框架