zoukankan      html  css  js  c++  java
  • Node.js 的初步理解

    Node.js 是一个采用C++语言编写的后端的 Javascript 的运行环境, 它使用了 google 的 V8虚拟机来解释和执行代码。Node.js 的有许多有用的内置的模块,比如 http, fs, events, querystring,url。当使用http 模块创建一个web server时,在IE 和 Firefox 浏览器下也是可以工作的。
     
    所以 Node.js 事实上既是一个运行时环境,同时又是一个库。
     
    Node.js采用  1.非阻塞;2.单线程;3.事件驱动
     
    既然它是 单线程,为什么是非阻塞呢?
     
    请看一个例子:
      var http = require('http');
     
      function sleep(millionseconds){
        var now = new Date();
        while((new Date()) - now < millionseconds);
      }
     
      function onRequest(request, response){
        var url = request.url;
        if(url.indexOf('sleep') > -1){
          sleep(5000);
        }
        response.write('Hello World');
        response.end();
      }
      http.createServer(onRequest).listen(8888);
     
    然后在第1个窗口输入地址 http://localhost:8888/sleep 先不要打开它,在第2个窗口输入地址http://localhost:8888/test 也不要打开它。接着在第1个窗口按下回车,然后快速切换到第2个窗口也按下回车。发现2个页面都加载了 5 秒钟。
     
    结论:/sleep 页面包含了阻塞的工作, 它阻塞了其它所有的处理工作。但是node 自己却说 “在node中除了代码,所有一切都是并行执行的”。 事实上,它是通过事件轮询(event loop)来实现并行,可以将函数通过参数传递来进行回调。下面一段话形象的描述了:
    “嘿,probablyExpensiveFunction()(这里指的就是需要花时间处理的函数),你继续处理你的事情,我(Node.js线程)先不等你了,我继续去处理你后面的代码,请你提供一个callbackFunction(),等你处理完之后我会去调用该回调函数的,谢谢!”
     
     
    下面实现一个如何用表单 post 数据和接受数据:
     
    它有 2 个页面:
      首页(包含 form表单)  /index
      目标页(包含从表单处拿到的数据)  /result
     
    用http 模块来创建一个 web server 对象,它的回调函数中有2个参数
     
    request参数,通过  request.url 判断当前访问的是 /index 还是 /result 页面。 还可以监听 'data' 和 'end' 来判断数据正在传送过程还是传送结束。
      var postData= '';
      request.addListener('data', function(chunk){ 
        postData += postData + chunk;
        console.log('data delivery'); 
      });
      request.addListener('end', function(){
        response.write(postData);
        
        response.end();
      });
     
    response 参数,通过设置 response.setHeader('content-type','text/html; charset=UTF-8'); 可以使传递的中文字符不是乱码。
     
    在 /result  页面 通过querystring 模块来获取表单传送过来的值。
      var querystring = require("querystring");
      response.write(querystring.parse(postData).text); (text 是表单的name <input name='text' />)
      response.end();
     
    ------------------------------------------------------------
    其知识点:
     
    如何引用模块
      可以用 exports 来导出这个模块,比如 test.js 里 exports.foo = 1; exports.foo2 = function(){}, 当其它模块要使用test.js ,则 var test = require('test.js'); test.foo; test.foo2();
     
      如果 test.js 里没用 exports, 代码是: this.a = 1; this.b = 2; 那么 var test = require('test.js'); test.a; test.b;  相当于new 一个构造函数的意思。
     
    事件流 events 模块
      var events = require("events"); 
      var emitter = new events.EventEmitter(); 
      emitter.on("myEvent", function(msg) { 
        console.log(msg); 
      }); 
      emitter.emit("myEvent", "Hello World.");
     
    emitter 还有 once, addListener, removeListener 等事件。
     
    文件系统 fs 模块
      fs.readFile 读取文件
      fs.unlink('test.js', function(){}) 删除文件
      fs.rename 重命名文件,当然同时还可以移动文件到其它目录。(类似于剪切的功能)
     
      同步的操作都是在方法后 加个Sync,比如 readFileSync, unlinkSync
  • 相关阅读:
    [Tips] uncompyle6进行python的pyc反编译
    [Tips] pip太慢,换源
    [Notes] docker build与docker file
    [Tips] 生成当前python环境的依赖
    [Tips] imagePullPolicy取值
    [Tips] docker镜像和容器导出导入
    js模块化历程
    从一个简单例子来理解js引用类型指针的工作方式
    数组去重的方法总结
    js中const,var,let区别
  • 原文地址:https://www.cnblogs.com/zhengming2016/p/5535260.html
Copyright © 2011-2022 走看看