四川福彩快乐12app下载-四川快乐12app官网(彩世界)
做最好的网站
来自 四川福彩快乐12app下载 2019-11-07 22:08 的文章
当前位置: 四川福彩快乐12app下载 > 四川福彩快乐12app下载 > 正文

node.js【四川福彩快乐12app下载】

你可能已经听说Node.js是“基于Chrome的V8 JavaScript引擎的异步JavaScript运行的”,并且它“使用事件驱动的非阻塞I / O模型,使其轻量级和高效”。但对某些人来说,这不是最好的解释,或许太过于概念化。

Node 本身运行 V8 JavaScript。等等,服务器上的 JavaScript?对,您没有看错,就是Javascript。对于只在客户机上使用 JavaScript 的程序员而言,服务器端 JavaScript 可能是一个新概念,但这个概念本身并非遥不可及,因此为何不能在服务器上使用客户机上使用的编程语言?

简单的说 Node.js 就是运行在服务端的 JavaScript。

我们可以使用它来构建桌面应用程序(使用像Electron这样的框架),编写Web或app服务器等等。

访问第一个服务器程序

  1.Localhost:8888  本机

  2.127.0.0.1:8888  本机

  3.192.168.1.30:8888  其他用户

Node.js是一个事件驱动I/O服务端JavaScript环境,基于Google的V8引擎,V8引擎执行Javascript的速度非常快,性能非常好。

​我们相信通过实验测试之后,相信很多人会更加了解阻塞,非阻塞,和同步,异步的使用。

Fs模块 文件解析模块

返回哪个页面,首先要知道用户请求的是什么网页,获得请求路径

    两个方法获取请求路径,请求文件:

    1.对象自带属性—URL属性:request.url

    2.url模块:var mypath=require(“url”)

引入fs

   var myfs=require(“fs”)

通过fs读取

   参数:

    1.路径,2.字符串编码集,3.回调函数,读取完毕后调用的函数:成功or失败

    myfs.readFile(“路径" mypath,"utf-8",function(err,data){

     response.writeHead(200,{"content-type":"text/html"});

     response.write(data);       

     response.end();

  });
var fs =require(“fs”);//加载文件系统模块

fs.readFile(“路径" mypath,“utf-8",function(err,data){

     response.writeHead(200,{"content-type":"text/html"});

      console.log(err);

      response.write(data);       

    response.end();

  });

事件驱动程序

Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。

当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。

这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)

在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。

 

四川福彩快乐12app下载 1

整个事件驱动的流程就是这么实现的,非常简洁。有点类似于观察者模式,事件相当于一个主题(Subject),而所有注册到这个事件上的处理函数相当于观察者(Observer)。

Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,如下实例:

// 引入 events 模块var events =require('events');// 创建 eventEmitter 对象var eventEmitter =new events.EventEmitter();

以下程序绑定事件处理程序:

// 绑定事件及事件的处理程序
eventEmitter.on('eventName', eventHandler);

我们可以通过程序触发事件:

// 触发事件
eventEmitter.emit('eventName');

请允许我个人指出一个问题:重要的是要认识到并非所有同步调用都必然是阻塞的。

请求响应对象request,response

阻塞代码实例

创建一个文件 input.txt ,内容如下:

菜鸟教程官网地址:www.runoob.com

创建 main.js 文件, 代码如下:

var fs =require("fs");var data = fs.readFileSync('input.txt');

console.log(data.toString());
console.log("程序执行结束!");

以上代码执行结果如下:

$ node main.js
菜鸟教程官网地址:www.runoob.com

程序执行结束!

你可以清楚地看到我们完成执行的速度有多快,而不是等待API One然后等待API Two,我们可以等待它们同时完成并将调用速度提高近50%。

模块化

正如我们买了一个智能手机那样,我们总是可以安装第三方软件来扩展手机的功能,听音乐,玩游戏,阅读等等。对于nodejs也是一样一样的。

本身nodejs相当一个平台,您也可以通过安装模块来扩展 Node 的功能。可用于 Node 的模块极大地 增强了这个产品,那些模块非常有用,将使用 Node 的开发人员通常会安装几个模块。因此,模块也就变得越来越重要,甚至成为整个产品的一个关键部分。

Node 应用程序是如何工作的?

在 Node 应用程序中,执行异步操作的函数将回调函数作为最后一个参数, 回调函数接收错误对象作为第一个参数。

 

 

如果同步操作可以设置完成而不阻塞线程或导致等待状态,则它是非阻塞的。大多数情况下,同步调用将被阻塞,完成所需的时间取决于多种因素,例如API服务器的速度,最终用户的互联网连接下载速度等。

Node项目工程目录结构

  1.app.js  服务器文件

  2.Public(文件夹) 静态资源

  3.routes (文件夹)   路由

  4.views (文件夹)  视图文件

  5.dist (文件夹)   上线后的资源  

完整请求响应
// 1 通过requer导入http模块,并且返回一个对象
var http=require("http");
// 2 创建服务器,设置回调函数
// 引入读文件的模块 fs
var fs=require("fs");
var server=http.createServer(function(request,response){
    console.log("服务器运行了");
    // request请求对象,response响应对象
    // console.log(request)
    // 响应数据 ,返回之前要加上响应头信息
    // response.writeHead(200,{"content-type":"text/html;charset=utf-8"})
    // response.write("<h1>hello world</h1>");
    // 响应结束
    // response.end();

    // fs.readFile ("路径",编码,函数(错误,读到的数据){})
    var newPath=request.url.split(".");
    if(newPath[1]=="html"){
        fs.readFile("public" request.url,"utf-8",function(error,data){
            // console.log(data)
            if(error==null){
                response.writeHead(200,{"content-type":"text/html;charset=utf-8"});
                response.write(data);
                response.end();
            }
        })
    }else if(newPath[1]=="css"){
        fs.readFile("public" request.url,"utf-8",function(error,data){
            // console.log(data)
            if(error==null){
                response.writeHead(200,{"content-type":"text/css;charset=utf-8"});
                response.write(data);
                response.end();
            }
        })
    }else if(newPath[1]=="jpg"||newPath[1]=="gif"||newPath[1]=="png"){
        fs.readFile("public" request.url,function(error,data){
            // console.log(data)
            if(error==null){
                response.writeHead(200,{"content-type":"image/" newPath[1]});
                response.write(data);
                response.end();
            }
        })
    }
    console.log(newPath)
})
// 3 监听端口,
server.listen("8888");
console.log("监听成功");

实例

创建 main.js 文件,代码如下所示:

 

// 引入 events 模块var events =require('events');// 创建 eventEmitter 对象var eventEmitter =new events.EventEmitter();// 创建事件处理程序var connectHandler =function connected(){
   console.log('连接成功。');// 触发 data_received 事件 
   eventEmitter.emit('data_received');}// 绑定 connection 事件处理程序
eventEmitter.on('connection', connectHandler);// 使用匿名函数绑定 data_received 事件
eventEmitter.on('data_received',function(){
   console.log('数据接收成功。');});// 触发 connection 事件 
eventEmitter.emit('connection');

console.log("程序执行完毕。");

接下来让我们执行以上代码:

$ node main.js
连接成功。数据接收成功。程序执行完毕。

什么是Node.js

编写第一个node程序

代码示例:

// 1 通过requer导入http模块,并且返回一个对象
var http=require("http");
// 2 创建服务器,设置回调函数
var server=http.createServer(function(){
console.log("服务器运行了");
})
// 3 监听端口,
server.listen("8888");
console.log("监听成功");

非阻塞代码实例

创建一个文件 input.txt ,内容如下:

菜鸟教程官网地址:www.runoob.com

创建 main.js 文件, 代码如下:

var fs =require("fs");

fs.readFile('input.txt',function(err, data){if(err)return console.error(err);
    console.log(data.toString());});

console.log("程序执行结束!");

以上代码执行结果如下:

$ node main.js
程序执行结束!菜鸟教程官网地址:www.runoob.com

以上两个实例我们了解了阻塞与非阻塞调用的不同。第一个实例在文件读取完后才执行完程序。 第二个实例我们不需要等待文件读取完,这样就可以在读取文件时同时执行接下来的代码,大大提高了程序的性能。

因此,阻塞是按顺序执行的,而非阻塞是不需要按顺序的,所以如果需要处理回调函数的参数,我们就需要写在回调函数内。

Node只是一个环境或运行时,可以在浏览器之外运行普通的JavaScript。

什么是回调?

回调是一种异步相当于一个函数。回调函数被调用在完成既定任务。Node大量使用了回调。Node所有的API写的都是支持回调的这样一种方式。例如,一个函数读取一个文件可能开始读取文件,并立即返回控制到执行环境 使得下一个指令可以马上被执行。一旦文件 I/O 完成,它会调用回调函数,同时传递回调函数,该文件作为参数的内容。因此不会有堵塞或等待文件I/O。这使得Node.js高度可扩展,因此可以处理大量的请求,而无需等待任何函数来返回结果

事件驱动

 

创建了服务器,并且向创建它的方法传递了一个函数。无论何时我们的服务器收到一个请求,这个函数就会被调用。我们不知道这件事情什么时候会发生,但是我们现在有了一个处理请求的地方:它就是我们传递过去的那个函数。至于它是被预先定义的函数还是匿名函数,就无关紧要了。这个就是传说中的 回调 。我们给某个方法传递了一个函数,这个方法在有相应事件发生时调用这个函数来进行 回调 。

Node.js 事件循环

Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。

Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。

Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。

Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数.


因此,同步操作会阻塞进程或线程,直到该操作完成,使线程处于“等待状态”。一个异步操作,在另一方面,是非阻塞的,它允许执行线程继续进行,无论操作完成所花费的时间或完成操作的结果如何,并且线程的任何部分都不会在任何时候进入等待状态。

Node.js 究竟是什么?

Node.js 是一个基于Chrome JavaScript 运行时建立的一个平台。

对于上图,我们不得不等待一段时间才能从API One中检索第一批结果。此后,我们不得不等待同样的时间来获得API Two的回复。

什么是 V8?V8 JavaScript 引擎是 Google 用于其 Chrome 浏览器的底层 JavaScript 引擎。实际上,JavaScript 引擎负责解释并执行代码。Google 使用 V8 创建了一个用 C 编写的超快解释器,该解释器拥有另一个独特特征;您可以下载该引擎并将其嵌入任何 应用程序。V8 JavaScript 引擎并不仅限于在一个浏览器中运行。因此,Node 实际上会使用 Google 编写的 V8 JavaScript 引擎,并将其重建为可在服务器上使用。

Node.js 回调函数

Node.js 异步编程的直接体现就是回调。

异步编程依托于回调来实现,但不能说使用了回调后程序就异步化了。

回调函数在完成任务后就会被调用,Node 使用了大量的回调函数,Node 所有 API 都支持回调函数。

例如,我们可以一边读取文件,一边执行其他命令,在文件读取完成后,我们将文件内容作为回调函数的参数返回。这样在执行代码时就没有阻塞或等待文件 I/O 操作。这就大大提高了 Node.js 的性能,可以处理大量的并发请求。


四川福彩快乐12app下载 2

阻塞非阻塞

  同步/异步:   消息通知机制相关=>需要自己关注还是提供callback

  阻塞/非阻塞:等待消息时的状态=>是否可以干别的事情

  同步阻塞: 劫匪看着衰男把钱装好,不能干其他事情

  同步非阻塞:劫匪自己也到处搜索宝贝,但是还要不时跑回来看看钱装好没有。

  异步非阻塞:劫匪自己也到处搜索宝贝,衰男把钱装好了自动过来告诉劫匪好了

  异步阻塞:  劫匪就在那里傻等着,也不用管钱是否装好,衰男把钱装好了自动过来告诉劫匪好了 

  我们需要通过它提过的一些支持的库自己编写,无法像Apache那样直接运行,V8引擎本身使用了一些最新的编译技术。这使得用Javascript这类脚本语言编写出来的代码运行速度获得了极大提升,又节省了开发成本。对性能的苛求是Node的一个关键因素。本质上就是为文件系统、数据库之类的资源提供接口。

阻塞非阻塞:可以简单理解为需要做一件事能不能立即得到返回应答,如果不能立即获得返回,需要等待,那就阻塞了,否则就可以理解为非阻塞。   

例如:

我去买一本书,立即买到了,这就是非阻塞;
如果恰好书店没有,我就等一直等到书店有了这本书买到了才走,这就是阻塞;

让我们看一下阻塞线程的同步调用的另一个例子。假设我们正在构建一个应用程序,用于比较两个Weather API的结果,以找出它们的差异化。我们以阻塞的方式调用Weather API One并等待结果。得到结果后,我们调用Weather API Two并等待其结果。

Node 是一个服务器端 JavaScript 解释器,它将改变服务器应该如何工作的概念。它的目标是帮助程序员构建高度可伸缩的应用程序,编写能够处理数万条同时连接到一个(只有一个)物理机的连接代码。

四川福彩快乐12app下载 3

设置请求响应对象,并且响应给客户端数据

// 1 通过requer导入http模块,并且返回一个对象
var http=require("http");
// 2 创建服务器,设置回调函数
var server=http.createServer(function(request,response){
console.log("服务器运行了");
// request请求对象,response响应对象
// console.log(request)
// 响应数据 ,返回之前要加上响应头信息
response.writeHead(200,{"content-type":"text/html;charset=utf-8"})
response.write("<h1>hello world</h1>");
// 响应结束
response.end();
})
// 3 监听端口,
server.listen("8888");
console.log("监听成功");

Node.js特性

  • Node.js库的异步和事件驱动的API全部都是异步就是非阻塞。它主要是指基于Node.js的服务器不会等待API返回的数据。服务器移动到下一个API调用,Node.js发生的事件通知机制后有助于服务器获得从之前的API调用的响应。

  • 非常快的内置谷歌Chrome的V8 JavaScript引擎,Node.js库代码执行是非常快的。

  • 单线程但高度可扩展 - Node.js使用具有循环事件单线程模型。事件机制有助于服务器在一个非阻塞的方式响应并使得服务器高度可扩展,而不是创建线程限制来处理请求的传统服务器。

  • 没有缓冲 - Node.js的应用从来不使用缓冲任何数据。这些应用只是输出数据在块中。

  • 许可证协议 - Node.js 在 MIT 协议 下发布

首先要了解什么是Node.js?其次要知道Node.js究竟“异步”与“同步”有什么不同意思?还要讨论,“事件驱动”和“非阻塞”的含义是什么?

假设我们正在进行数据库调用以检索有关用户的属性,该调用需要时间,如果请求是“阻塞”,那么这意味着它将阻止我们的程序执行,直到调用完成。在这种情况下,我们发出了“同步”请求,它最终阻止了线程。

因此请注意,一旦我们调用了API One并开始等待它的响应,我们也调用了API Two并开始等待它的同时响应它。

阻塞/非阻塞和同步/异步

在非阻塞调用的情况下,我们会有这样的事情:

本文由四川福彩快乐12app下载发布于四川福彩快乐12app下载,转载请注明出处:node.js【四川福彩快乐12app下载】

关键词: 与非 Node js node.js