node.js
- 00hello.js
var msg='hello nodejs'
console.log(msg)
- 01没有bom和dom.js
console.log(window)
console.log(document)
nodejs和浏览器中的js不一样,是没有bom和dom。上面的代码输出错误
- 02读写文件.js
// 浏览器中的javascript是没有文件操作的能力
// 但是node中的javascript具有文件操作的能力
// fs是file-system的简写,就是文件系统的意思
// 在node中如果想要进行文件操作,就必须引入fs这个核心模块
// 在fs这个核心模块中,就提供了所有的文件操作相关的API
var fs=require('fs');
// 例如:fs.readFile 就是文件模块api中用来读取文件的方法
// 读取文件方法中 第一个参数就是要读取的文件路径
// 第二个参数是一个回调函数(error,data)
// 成功 data-数据 error-null
// 失败 data-undefined error-错误对象
fs.readFile('text.txt',function(error,data){
// 当console.log(data),就会输出buffer二进制数据
// 我们可以通过toString方法把其转换成我们认识的字符
console.log(data.toString())
});
fs.writeFile('input.txt','nihhaojiushiwo',function(error,data){
if(error){
console.log('写入失败');
}
else{
console.log('写入成功');
}
});
- 05-http.js
// 1、获取http核心模块
// 2、使用http.createServer()方法创建一个web服务器 返回一个Server实例
// 3、接受请求server.on('request',function(){})
// 4、绑定端口号,启动服务器server.listen(3000,function(){})
var http=require('http');
var server=http.createServer();
// 注册request请求事件
// 当客户端请求过来,就会自动触发服务器的request请求事件,然后执行第二个参数,回调处理函数
// request请求事件的回调处理函数,需要接受两个参数
// Request请求对象(请求对象可以用来获取客户端的一些请求信息,例如请求路径)
// Response响应对象 (响应对象可以用来给客户端发送响应消息)
server.on('request',function(request,response){
console.log('收到客户端的请求了,请求路径是: ' + request.url )
//response 对象有一个方法:write 可以用来给客户端发送响应数据
//write可以使用多次,但是最后一定要使用end来结束响应,否则客户端会一直等待
response.write('hello')
response.write('nodejs')
// 告诉客户端,我的话说完了,你可以呈递给用户了
response.end()
});
server.listen(3000,function(){
console.log('服务器启动成功,可以通过http://127.0.0.1:3000/ 来进行访问')
})
// 服务器的作用
// 提供服务 : 对数据的服务
// 客户端发请求
// 服务器接受请求
// 服务器处理请求
// 服务器发送响应
- 06-http-res.js
var http=require('http')
var server=http.createServer()
server.on('request',function(req,res){
// console.log('收到请求了,请求路径是:' + req.url )
var url=req.url
if(url === '/'){
res.end('index page')
}else if(url === '/login'){
res.end('login page')
}else{
res.end('404 not Found')
}
})
server.listen(3000,function(){
console.log('服务器启动成功,可以访问了')
})
- 09-简单模块化.js
- a.js
// require是一个方法
// 用来加载模块
// 在node中,模块有三种
// 1、具名的核心模块 例如fs、http
// 2、用户自己编写的文件模块
// 相对路径必须加./(相对路径中的./不能省略,否则报错)
// 可以省略后缀名
// 3、在node中,没有全局作用域、只有模块作用域
// 外部访问不带内部、内部也不能访问到外部
// 默认都是封闭的
// 既然是模块作用域,那如何让模块与模块之间进行通信呢
// 有时候,我们加载文件模块的目的不是为了简简单单的执行里面的代码,更重要的是为了里面的方法或者是变量
console.log('a start')
var bExports=require('./b')
console.log(bExports.foo)
console.log(bExports.add(10,30))
console.log('a end')
- b.js
// 在每个文件模块中都提供一个对象:exoports
// exports默认是一个空对象
// 你要做的就是把所有需要被外部访问的成员赋值给exports对象
console.log('b start')
require('./c.js')
console.log('b end')
exports.foo='hello'
exports.add=function(x,y){
return x+y;
}
- 11-Content-Type.js
// 结合fs发送文件中的数据
// 2、Content-Type
// 不同的资源对应的Content-Type是不一样的
// 图片不需要指定代码
// 一般为字符数据才指定编码
var http=require('http')
var fs=require('fs')
var server=http.createServer()
server.on('request',function( req, res){
var url=req.url;
if(url === '/'){
// 在服务端默认发送的数据,其实是utf8编码的内容
// 但是浏览器中不知道你是utf8编码的内容
// 浏览器在不知道服务器响应内容的编码的情况下会按照当前操作系统的默认编码去解析
// 中文操作系统默认是gbk
// 解决方法就是正确的告诉浏览器我给你发送的内容是什么编码的
// 在http协议中,Content-Type就是用来告诉对方我给你发送的数据内容是什么类型的
res.setHeader('Content-Type','text/plian;charset=utf-8')
// text/plain是普通文本 text/html是超文本
res.end('hello 世界')
}
else if(url === '/index'){
fs.readFile('./resource/index.html',function(err,data){
if(err){
res.setHeader('Content-Type','text/plian;charset=utf-8')
// text/plain是普通文本 text/html是超文本
res.end('文件读取失败,请稍后重试!')
}
else{
res.setHeader('Content-Type','text/html;charset=utf-8')
// text/plain是普通文本 text/html是超文本
res.end(data)
}
})
}
})
server.listen(3000,function(){
console.log('server is running')
})
总结
模块系统
- 在Node中没有全局作用域的概念
- 在node中,只能通过require方法来加载执行多个javascript脚本文件
- require加载只能是执行其中的代码,文件与文件之间由于是模块作用域,所以不会有污染的问题
- 模块作用域虽然带来了一些好处,可以加载执行多个文件,可以完全避免变量命名冲突污染的问题
- 但是某些情况下,模块与模块之间是需要进行通信的
- 在每个模块中,都提供一个对象:
exports
- 该对象默认是一个空对象
- 你要做的就是把需要被外部访问的成员手动挂载到
exports
接口对象中 - 然后谁来
require
这个模块,谁就可以得到模块内部的exports
接口对象
核心模块
- fs文件操作模块
- http 网络服务构建模块
- os 操作系统信息模块
- path 路径处理模块
- 所有核心模块在使用的时候必须使用
require
方法来加载,然后才可以使用
var fs =require('fs')
http模块
- 端口号
IP地址定位计算机
端口号定位具体的应用程序 - Content-Type
服务器最好把每次响应的数据是什么内容类型都告诉客户端,并且要正确的告诉
不同的资源对应的Content-Type是不一样的
对于文本类型的数据,最好都加上编码,目的是为了防止中文解析乱码问题 - 通过网络发送文件
发送的并不是文件,本质上来讲发送的是文件的内容
当浏览器收到服务器响应内容之后,会根据你的Content-Type进行相应的解析