• node.js 学习笔记一


    2017-05-01

    安装node

    我没安装,下载即使用。要全局使用的话把node加入到环境变量中即可。
    以下命令环境均为 cmd 。

    体验

    体验一:

    1. 在命令行输入 node ,即进入 node 程序。
    2. 再输入 console.log(1) ,回车,可以输出 1 。感觉就像浏览器控制台一样。
    • 按两次 ctrl+c 退出node程序。

    体验二:

    1. 创建文件 t1.js ,内容为 console.log(1)
    2. 在控制台输入 node t1.js ,回车,可以输出 1 。感觉像浏览器执行了js文件一样。

    体验感觉:

    1. 嗯是的,node 就是一个 js 解释器。基于谷歌浏览器的 v8 js 解释引擎。
    2. 与浏览器控制台不同的是,命令输入时浏览器控制台方便得多,浏览器可以方便换行和代码提示,但浏览器不支持直接运行js文件。
    3. node 不只是 js 解释器,还提供了一些系统级别的 api。

    一些按键

    • ctrl + c - 退出当前终端。
    • ctrl + c 按下两次 - 退出 Node REPL。
    • ctrl + d - 退出 Node REPL.
    • 向上/向下 键 - 查看输入的历史命令
    • tab 键 - 列出当前命令
    • .help - 列出使用命令
    • .break - 退出多行表达式
    • .clear - 退出多行表达式
    • .save filename - 保存当前的 Node REPL 会话到指定文件
    • .load filename - 载入当前 Node REPL 会话的文件内容。

    node服务器

    1. 创建文件 s1.js ,内容为:
    var http=require('http'); //使用 require 载入 http 模块。
    http.createServer(function(request,response){
      response.writeHead(200,{'Content-type':'text/plain'}); //writeHead 发送请求头
      response.end('Hi'); //写入数据到请求主体,此句相当于 【response.write('Hi');response.end();】 。
    }).listen(8888); //通过 listen 监听 8888 端口
    console.log('服务开始了')
    
    1. 使用 node s1.js 运行它,然后在访问 http://127.0.0.1:8888/ ,就能看到输出的内容 Hi
      注: 如果修改了 js 文件中的内容,需要再用 node 执行一下,才可以看到最新修改。

    异步读取文本文件

    var fs=require('fs');
    fs.readFile('i1.txt',(err,data) => {
      console.log(data);
      console.log(data.toString());
    })
    console.log('读取文本')
    

    输出:

    读取文本
    <Buffer 65 6e 20 e4 b8 ad e6 96 87 0d 0a>
    en 中文
    

    上面读取的 data 输出是 <Buffer ... ,为什么呢?而再加上 .toString() 可以正确输入中文。猜想前者是某种码,一般是二进制、

    Buffer 在node中是全局变量,可用来处理二进制数据。
    .toString() 用来解码。

    ()=>{} 是什么鬼?

    有没有感觉上面的 () => {}function(){} 很像?他们是不是一样的呢?

    var fs=require('fs');
    fs.readFile('i1.txt',function(err,data){
      console.log(data);
      console.log(data.toString());
    })
    console.log('读取文本')
    

    把 => 改成 function 形式,发现输出相同。

    但是:

    (function(a){
      console.log(a)
    }(1));
    
    // 下面这段代码就不能运行了。
    ((a) => {
      console.log(a)
    }(2));
    

    原来箭头函数有这些问题:

    函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象。
    不可以当作构造函数,也就是说,不可以使用new命令,否则会抛出一个错误。
    不可以使用arguments对象,该对象在函数体内不存在。如果要用,可以用Rest参数代替。
    不可以使用yield命令,因此箭头函数不能用作Generator函数。

    不了解还是少用好。

    同步读取文本文件

    var fs=require('fs');
    var data=fs.readFileSync('i1.txt');
    console.log(data.toString());
    console.log('读取文本');
    

    输出:

    <Buffer 65 6e 20 e4 b8 ad e6 96 87 0d 0a>
    en 中文
    读取文本
    

    上面几个例子的使用体验

    上面我们使用了 var fs = require('fs') ,接着有 fs.readFile ,这个 fs 和 readFile 是什么鬼?
    通过手册:http://nodejs.cn/api/ 可以看出来,http、fs是一个模块,也叫,与js比较。

    • fs.readFile(file[, options], callback)
    • window.open(URL,name,specs,replace)

    那么,不用说什么,大家都能明白了,他们的概念很相似,所以说学 node 前端无需太多成本。所以对于查js手册已经很熟悉的我们来说,一下子就知道 node 手册的使用了,对学习和使用node是非常有利的。

    事件

    当事件发生时,注册到这个事件的事件监听器被依次调用,事件参数作为回调函数参数传递。   

    var events = require('events');
    var eventEmitter = new events.EventEmitter(); // 创建事件发生器
    eventEmitter.on('connection', function(){ // 绑定事件一
      console.log('事件一处理程序');
      eventEmitter.emit('data_received'); // 触发绑定事件二
    });
    eventEmitter.on('data_received', function(){ // 绑定事件二
       console.log('事件二处理程序');
    });
    eventEmitter.emit('connection'); // 触发绑定事件一,事件二才触发
    
    // 输出
    // 事件一处理程序
    // 事件二处理程序
    
    var events=require('events');
    var emitter=new events.EventEmitter();
    emitter.on('someEvent',function(a,b){console.log('e1',a,b) });
    emitter.on('someEvent',function(a,b){console.log('e2',a,b) });
    emitter.emit('someEvent','参数A','参数B');
    
    // 输出
    // e1 参数A 参数B
    // e2 参数A 参数B
    
    • 不好理解呀。

    Buffer 缓冲区

    该类用来创建一个专门存放二进制数据的缓存区。

    他的操作方法有写入、读取、转为JSON、合并、比较、拷贝、剪切等。

    • 读取缓冲区数据: buf.toString([encoding[, start[, end]]])
    • encoding - 使用的编码。默认为 'utf8' 。
    • start - 指定开始读取的索引位置,默认为 0。
    • end - 结束位置,默认为缓冲区的末尾。
    buf = new Buffer(26);
    for (var i = 0 ; i < 26 ; i++) {
      buf[i] = i + 97;
    }
    console.log( buf.toString('ascii'));       //abcdefghijklmnopqrstuvwxyz
    console.log( buf.toString('ascii',0,3));   //abc
    console.log( buf.toString('utf8',3,5));    //de
    console.log( buf.toString(undefined,3,5)); //de 默认是utf-8
    
    
  • 相关阅读:
    remove-duplicates-from-sorted-list
    combination-sum-ii(熟悉下Java排序)
    decode-string(挺麻烦的)
    subsets-ii(需要思考,包括了子数组的求法)
    remove-duplicates-from-sorted-array
    delete-node-in-a-linked-list
    find-all-duplicates-in-an-array(典型的数组中的重复数,不错,我做出来了,可是发现别人有更好的做法)
    【转载】大型网站架构的演进
    【转载】第三方支付平台相关-支付、对账
    【Todo】JS跨域访问问题的解决
  • 原文地址:https://www.cnblogs.com/daysme/p/6792470.html
Copyright © 2020-2023  润新知