一、文件操作
fs是file-system的简写
在node中进行文件操作必须要引入fs这个核心模块儿,该模块儿提供了对所有文件进行操作相关的API
1.使用require方法加载fs核心模块
require是一个方法,有两个作用:
- 用来加载模块,并执行其中代码
- 接收加载模块导出的接口对象exports
模块有三种:
- 核心模块(内置模块)
- 用户自定义的文件模块
- 第三方模块
var fs = require('fs');
2.读取文件
/*
第一个参数是读取的文件全路径
第二个参数是一个回调函数
*/
fs.readFile('hello.txt',function(error,data){
/*
读取成功
data 数据
error null
读取失败
data undefined没有定义
error 错误对象
*/
console.log(data);
/*
默认读取文件是16进制
使用toString方法进行转换
*/
console.log(data.toString);
});
3.写出文件
var fs = require('fs');
/*
第一个参数:文件路径全名
第二个参数:文件内容
第三个参数:回调函数
*/
fs.writeFile('hello.txt','hello node',function(error){
/*
成功:
文件写入成功
error null
失败:
文件写入失败
error 错误对象
*/
console.log('文件写入成功');
});
4.回调函数判断结果
//读取文件
var fs = require('fs');
fs.readFile('hello.txt',function(error,data){
//通过判断error确认是否读取成功
if(error){
console.log('读取文件失败了');
}else{
console.log(data.toString);
}
});
//文件写出
fs.writeFile('hello.txt','hello node',function(error){
//通过判断error确认是否写入成功
if(error){
console.log('写入失败');
}else{
console.log('写入成功');
}
});
二、http构建服务器
node中提供了一个核心模块:http,用来创建服务器
1.加载http核心模块
var http = require('http');
2.使用http.createServer()方法创建一个Web服务器
//返回一个Server实例
var server = http.createServer()
3.服务器作用
- 提供服务:对数据的服务
- 发送请求
- 接受请求
- 处理请求
- 反馈(发送响应)
- 注册request请求事件
- 当客户端请求过来,就会自动触发服务器的request请求的事件,然后执行第二个参数:回调处理函数
4.监听request请求事件,设置请求处理函数
server.on('request',function(){
console.log('收到客户端的请求了');
});
5.绑定端口号,启动服务器
server.listen(3000,function(){
//如果报错‘ EADDRINUSE :::端口号 ’,说明该端口号被占用了
console.log('服务器启动成功了,可以通过 http://127.0.0.1:3000/ 来进行访问');
});
注:以上代码可以运行,cmd直接打开js文件即可运行,此时浏览器访问后控制台可以输出日志,但是没有响应,浏览器会一直处于等待状态
6.简单的响应代码
var http = require('http');
var server = http.createServer();
/*
request 请求事件处理函数,需要接受两个参数
request 请求对象,可以用来获取客户端的一些请求消息
response 响应对象,可以用来给客户端发送响应消息
*/
server.on('request',function(request,response){
//获取客户端请求的路径(服务器地址端口号之后的路径)
console.log('收到客户端的请求了,请求路径是:'+request.url);
//response对象有一个方法:write,可以用来给客户端发送响应数据,可以使用多次,但最后必须只用end来结束响应,否则客户端会一直处于等待状态,也就是响应未结束,浏览器不会呈现数据
//只能响应字符串或二进制
response.write('hello');
response.write('nodejs');
response.end();
//一般在end的同时去响应数据
response.end('hello nodejs');
//此时无论请求路径为多少,响应都是hello nodejs,可以利用request.url判断路径,来响应相对应的数据
});
server.listen(3000,function(){
console.log('服务器启动成功');
});
7.根据请求路径响应数据
var http = require('http');
var server = http.createServer();
server.on('request',function(req,res){
var url = req.url;
if(url === '/'){
res.end('index page');
}else if(url === '/login'){
res.end('login page');
}else{
res.end('404 Not Found.');
}
//响应json
var goods = [
{
name:"goods1",
price:100
},
{
name:"goods2",
price:200
},
{
name:"goods3",
price:300
}
]
if(url === '/goods'){
res.end(JSON.stringify(goods));
}
});
server.listen(80,function(){
//浏览器默认以80位端口号
console.log('服务器启动成功');
});
三、多模块执行
1.通过require加载其他js
一个js文件中可以通过require来调用其他模块的代码,顺序是从上向下依次执行,即当执行到require时执行完加载的代码后再执行后面的代码
相对路径中必须加 ./
,不能省略
在node中没有全局作用域模块作用域,也就是通过require联系起来的js文件中的代码不会相互影响
//a.js
console.log('a start');
require('./b.js'); //后缀名可以省略
console.log('a end');
//b.js
console.log('b start');
//执行结果
a start
b start
a end
2.访问其他js中的变量和方法
//a.js
var exports_b = require('./b'); //获取b的exports对象
console.log(exprots_b.text);
console.log(exports_b.test());
//b.js
exports.text = 'hello'; //将text = 'hello'放到exports对象中
exports.test = function(a){
return a;
}