首先,我们要理解node.js的概念,以及他的用法。node.js 是帮助我们架设外部服务器,来进行外部服务的提供。由于node.js的特点是有事件驱动(异步的处理),这样就最大化利用资源。而事件驱动(异步的处理)是靠回调函数的机制来进行。在数据加载完毕后,会触发回调函数的执行。来进行解析数据,后台给我们发送的数据。这是回调函数的妙用。在一些方法中,我们经常在方法里传参,来进行回调函数的执行。这是我们的方法。在动画中,我们经常用传参的方法传入回调函数作为参数来代表动画完成的来触发回调函数的执行。可以作为连续的执行脚本。
其实,node.js本身也是js 也需要执行运行的环境,所以,我们需要为node.js配置环境, 在执行代码的时候,我们也需要在浏览器进行解析,导入到浏览器中,进行解析。来看服务器的数据。但是我们还可以通过cmd的命令进行解析node(架设的服务器)数据。通过命令,我们第一步首先是进入我们的文件项目的路径。直接把文件导入到命令中。然后进行把文件的路径取掉。就拿到我们需要文件所在的路径。然后,在命令里,直接在用node命令来直接调用node文件,在工作中,我们要经常用到命令的形式的来经常调用node文件。在编辑器中,我们也可以用webstorm的编辑器来。但是我们也可以在编辑器里用命令的形式来进行解析node文件。
node.js虽然是脚本语言(本质是javascript),而且是单线程的支持。但是由于是异步的处理数据的方法,所以,node.js还是能处理大量的高频率的数据请求的,还是有很大市场的。在架设服务器上,处理高频率的数据请求,我们还选择的是node.js的方法。由于node.js是由于事件驱动的,非阻塞式1/0的模型,使其轻便高效。 node.js服务器的各种功能是由模块来进行管理的。每个模块都是有专一的功能或者提供相对应的服务。所以,我们要了解模块的概念。模块的意思是工具的集合。我们的nede.js的服d 务是在相对应的模块来进行管理。为了和jQuery的插件区别开,因为jQuery的插件是开放式的开发。人人都可以做插件,让别人下载。所以,jQuery的插件是存在风险很大的,存在隐形的bug的。而node.js的模块是闭环管理的,所以,在官网上是可以下载的。而且是安全的。这是node.js的模块是很重要的特点。
在前端上,我们的用到的node.js是http和fs模块。因为在前端我们主要通过接口的来向服务器发送请求服务器数据。这是我们要经常用到的。http模块有很多的方法来进行请求数据或者是读写写去数据的。因此,我们不仅要为node.js来配置环境,建立js文件后,我们要为js引入模块。这是我们第一步要做到的。引入相对的模块。比如,我们在架设一个基础的服务器的服务。那么,我们需要引入的是,http模块。
var http = require("http"); // 通过require()方法来调用http模块。
调用到http模块后,我们可以通过http模块创建(server)服务来进行操作。什么操作呢?就是我们的对前端请求文件的路径和要把前端请求的文件发给后台。
var server = http.createServer(function(req,res){ // 我们可以通过req的属性(url)来知道前端需要什么类型的文件,以及是文件的类型。 (req.url)所以,我们也可以通过路由来判断前端需要文件的类型以及路径。而路由是逻辑分支,所以,我们对于if....else..的逻辑语句是非常实用的。
if(req.url=="./data.html"){
// 如果请求data.html就执行这个路由。我们可以通过这个逻辑分支来进行数据的返回。我们可以通过res对象进行返回数据给前端。如果前端请求的是页面的话我们可以通过node.
res.write("welcome to data.html") //这是一段文本。我们可以通过send(“文件的绝对路 径”)来进行操作发送页面给前端。例如:
res.send("文件的绝对路径") // 方法
}else if(req.url=="./index.html"){ // 这也是路由的分支。逻辑业务。我们的模式也是一样的。可以通过相对应的方法来进行操作。用res对象来进行操作。例如是:
res.write(“welcome to index.html”) // 同样的是给发送一段文本。
res.send("文件的绝对路径")
}
})
// 通过调http模块的createServer服务来进行操作。在createServer()方法中,其运行原理是通过回调函数的传参来进行和前端交互的。通过传入req,res的对象来进行操作。通过路由分支进行逻辑判断的业务需要。但是,如果后台的数据交互好了。但是,怎么通知前端去接受呢?在这个完整的过程中,前端和后端的过程是三次握手,四次分手的过程。数据交互好了是握手的过程的,但是,我们需要的分手过程是用到的是:后台响应res对象的end()方法。即:
res.end(); // 这样的整个过程就完成了。数据的完成了。这样,后台和前端就可以拿到需要的数据了.在end ("hello")方法中可以传参,结束的响应的结果。只接受字符串类型。
下一步是监听端口号。端口的不同,相对应的服务也是不一样的。所以,在数据的处理方式也是在相对应的端口号中处理的,因为node.js是事件驱动来进行的。所以,我们要通过监听端口号的事件处理机制来进行触发整个数据的交互。让服务器(server)来监听端口号: 通过调用server.listen()方法来进行操作。通过这样的方法可以传参: 第一个参数是端口号(这端口号是非常重要的。) 知名的端口号:80:是系统的定义的端口号:是http协议的端口号。
443:这个端口号是https协议的端口号,前三千的端口号的已经系统占用了。我们最好是后三千的端口号。注意是:端口只能提供一项服务,如果端口号被重复占用了,我们需要更改端口号,或者是删除的端口号。
server.listen(8880,function(){ // 这是我们的通过服务器来监听的端口号的作用。
console.log("success") // 这是我们的在控制台来进行判断是否成功还是有错误。
});
这是整个过程。架设外部服务器的完整的过程、我们需要的是几个重要的步骤。
下面我们可以通过node.js来进行文件的读写操作。这是node.js是非常重要的特性。也是和javascript不同的地方。因为javascript是不能操作内存的和本地的磁盘的文件。但是node.js是可以操作的。这是我认为是最大的特点。
我们先看看node.js的读入方式:
// 我们先引用node.js的文件的操作模块(fs)
var fs = require("fs");
// 调用fs模块的readFile()方法进行操作。注意:这是异步的操作。
fs.readFile("url","utf-8") // 里面可以传参。第一是文件的路径。第二个参数是读取的格式 utf-8 我们可以省略。建议是要省略。因为格式容易出错。 建议省略。第三个参数是回调函数 function(){} 这个回调函数是重要的。我们可以在回调函数传参可以拿到读取的值。在回调函数里传第一个参数是:err 是错误的信息。第二个参数是:data。这是我们要读取的值。
fs.readFile("url",function(err,data){ // 在这里我省略了读取的文件格式。如果是字符串,我们可以通过toString()方法来进行转化。err :既然是错误信息,我们可以通过err的值来判断是否读入成功了。逻辑判断。
if(err){ // 如果err 不为空(null)或者不是undefined ,就判断。
console.log("读入失败")
}else{
console.log(data.toString) // 我们可以通过字符串的方法来进行转化。toString()
}
}
// 写入文件的方法。 // 注意: url 这是新建文件的。系统可以自动创建。 第二个参数是要写入的内容。用字符串的形式来进行。第三个参数是写入的方式 是重复的写法,还是拼接的写法。是一个对象。来进行属性和属性值。是一个键值对来传入。来设置写法的方式。
fs.writeFile("url","写入的内容",{ 这是个对象
flag:"a" // 这是拼接写法。flag:"w" // 这是重复写法。
},function(err){
if(err){
return console.err(err)
}else{
console.log("写入成功")
}
})
// 复制的操作
// 先读取文件的内容。 用res响应的对象来调相关的方法来进行。操作。
var rs = res.readFlie("url","读取方式(可省略)",function(err,data){ // 通过回调函数的传参和执行代码来进行操作。我们也建议读取的方式要省略,避免出现错误。在回调函数中传参的第二个参数是我们要读取的数据。
我们可以通过各种方法来进行操作data的值。
console.log(data)
})
// 写入的的方法。
var ws = res.wirteFile("url","写入的内容",{flag:"a"},function(err){
if(err){
console.log(err)
}else{
console.log("写入成功")
}
})
// 异步读入
fs.readFile("url",function(err,data){
if (err){
console.log(err)
}else{
console.log("成功读入")
}
})
// 异步的写入
fs.wirteFile("url","写入的内容(data)",function(err){ // 写入的内容要和读取的内容的格式要保持一致。
if(err){
console.log(err)
}else{
console.log("拷贝成功")
}
})
// 这是管道流的读写方法。
// 引入模块
var fs = require("fs")
// 读取流 用fs模板的方法来调用。
var rs = fs.createReadSteam("url")
// 在读取流没有读取64k数据后,会触发data事件。
var result;
rs.on("data",function(chunk){ // 这个data是个事件,来分64k获取数据。但是,我们的回调函数 的参数chunk是64k的片段,我们需要拼接数据的,来拼接到chunk.定一个全局变量。
result += chunk; 这是拼接到的数据。
})
// 当数据读取完毕了,会触发end()事件
rs.on("end",function(){
console.log(result) // 这样就可以获得的完整的数据的。result 一定是在完整的数据,也就 是我们触发end()事件 rs.on("end",function(){}) 回调函数是数据拼接完毕后,来进行回调函数的执行进行获取读取解析完整的数据。 result的里面包含着完整的数据。
})
// 写入流
var ws = fs.createWriteStream("url");
// 通过write()方法写入数据。
ws.write("要写入的内容")
还有一种简单的写法来实现文件的拷贝。用pipe()方法来进行操作。
var rs = fs.createReadStream("url") // 读取的文件。
var ws = fs.createWirteStream("ul") // 写入的文件。
// 用pipe()方法来进行把读取的内容(读入流)写进(写入流)文件中。
rs.pipe(ws) // 通过pipe()方法进行操作。