node.js笔记

作者: 李华炎 | 来源:发表于2018-04-13 13:15 被阅读0次

    Node.js概述

    1. 什么是node.js
      node.js不是一种编程语言,是一个可以让js语言运行在服务器端的开发平台。(由Chrome浏览器的V8引擎作为基础开发的。)

    2. node.js有什么特性

      单线程:只有一条线程用来执行所有的任务

      事件驱动:通过“事件环”的机制来执行事件回调函数

      非阻塞I/O: 当有i/o操作时,会将i/o操作添加到事件队列中,执行下一个事件的计算,当i/o操作完成时,通过事件驱动再回到原任务上来,从而实现非阻塞。

    3. Node.js自身哲学,是花最少的硬件成本,追求最大的并发,更高的处理性能。
      没有语法:node.js不是一种独立的语言,它是使用js进行编程的。

    V8引擎介绍

    1. v8引擎是谷歌公司开发的用于Chrome浏览器解析js代码使用的js引擎。
    2. v8引擎是使用C++语言开发出来的并且是开源的。

    模块分类

    1. 核心模块,nodejs 自身拥有的功能模块(如:http、fs、path、util...)
    2. 文件模块(自己定义的文件,如xxx.js)
    3. 第三方模块(使用npm下载的第三方模块)
    // 1.核心模块的引入
    var http = require('http');
    var fs = require('fs');
    var path = require('path');
    var util = require('util');
    
    // 2.文件模块的引入
    var util = require("./xxx.js"); // .js可以省略
    
    // 3.第三方模块的引入
    var express = require("express");
    

    node全局对象/变量

    1. 在浏览器JavaScript 中,通常window是全局对象, 而Node.js中的全局对象是global,所有全局变量(除了 global 本身以外)都是global对象的属性。
    2. process 是一个全局变量,即 global 对象的属性。通常在你写本地命令行程序的时候使用。
    3. console 是一个全局变量,即 global 对象的属性。

    http模块

    var http = require('http');
    
    http.createServer(function (req,res) {
        res.statusCode = 200;
        res.setHeader("Content-type","text/plain; charset=utf-8")
        res.end('Hello httpServer');
    }).listen(3000,'127.0.0.1',function () {
        console.log('服务器已运行,请在浏览器打开127.0.0.1:3000/查看结果');
    });
    

    url模块

    // 1. url模块
    var url = require('url');           // 引入模块
    
    url.parse(request.url);             // 将url字符串转换为一个对象
    
    url.parse(request.url, true).query;// 将query属性对应的对象返回
    
    url.format(obj);                    // 将对象转换为url字符串
    
    url.href;       // 指整个路径  如URL 'https://example.org/abc/xyz?123'
    url.protocol;   // 指协议
    url.host;       // 指主机名,包含端口
    url.hostname;   // 指主机名,不包含端口  如URL 'https://example.org:8888' 的 example.org
    url.port;       // 指端口  如URL 'https://example.org:8888' 的 8888
    url.pathname;   // 指路径名  如URL 'https://example.org/abc/xyz?123' 的 /abc/xyz
    url.search;     // 指问号后面的 如URL 'https://example.org/abc/xyz?123' 的 123
    url.hash;       // 指#号后面的内容  如URL 'https://example.org/foo#bar'的 bar
    url.parse(req.url).pathname;        // 输入的路径名
    
    

    使用 url.parse() 方法可以返回在浏览器中输入的url地址的对象,该对象包含http请求所有的数据,如下案例。

    // 将一个url字符串转换为Url对象。Url对象里面包含url的所有信息
    var object = url.parse("https://www.imooc.com/course/list");
    
    object {
     protocol: 'https:',
     slashes: true,
     auth: null,
     host: 'www.imooc.com',
     port: null,
     hostname: 'www.imooc.com',
     hash: null,
     search: null,
     query: null,
     pathname: '/course/list',
     path: '/course/list',
     href: 'https://www.imooc.com/course/list' }
    

    util模块

    var http = require('http');
    var url = require('url');
    var util = require('util');
    
    http.createServer(function (req,res) {
        res.statusCode = 200;
        res.setHeader("Content-type","text/plain; charset=utf-8")
    
        // util一般在测试的时候将url对象[Object]展开
        res.end(util.inspect(url.parse(req.url)));
    }).listen(3000,'127.0.0.1',function () {
        console.log('服务器已运行,请在浏览器打开127.0.0.1:3000/查看结果');
    });
    

    通过 util.inspect() 方法可以将包含url中所有信息的对象展开,如下图所示

    urlObject.png

    fs模块

    fs.readFile // 读取文件

    fs.readdir // 读取目录下的所有文件,包括目录

    stat.isDirectory // 判断是不是目录

    fs.mkdir("./album/ccc"); // 创建一个目录

    
    

    node.js中自带的包

    • http
    // 引包
    var http = require("http");         
    // 创建一个服务
    var server = http.createServer(function(req,res){
        // 
        if(request.url == "/fang"){
            fs.readFile('./test/fang.html', function(err,data){
                response.writeHead(200, {"Content-type" : "text/html;charset=utf-8"});
                response.end(data);
            });
        }
        // 设置响应头内容类型
        res.writeHead(200,{"Content-type":"text:html;charset=utf-8"});
        // 浏览器解析结束,没有菊花了
        res.end("Hello Wordl!!");
    });
    // 监听
    server.listen(3000,"127.0.0.1");    
    
    • url
    • querystring

    序列化为字符串(querystring.stringify),反序列化为对象(querystring.parse)

    转义为看不懂的编码(querystring.escape),反转义为看得懂得文字(querystring.unescape)

    1.常使用querystringparse 方法将字符串 反序列化为一个键值对的集合(对象)。

    2.常使用querystringstringify 方法将url 中携带的参数序列化为字符串。

        if (request.url == "/post" && request.method.toLowerCase() == "post"){
            //  获取数据的方式都是这个步骤
            // 创建一个字符串用于存放chunk
            var allData = "";
          
            // 对请求进行监听,每次接受一小段数据,分出能力去做别的事情,避免阻塞整个进程
            request.addListener("data", function (chunk) {
                allData += chunk;
            });
          
            // 接收数据结束
            request.addListener("end", function () {
                //console.log(allData.toString()); //allData本来就是加密后的字符串,toString方法没有用
                var obj = querystring.parse(allData);   // ********obj不继承自Object,只是一个集合
                console.log(obj);
                console.log(obj.name);
                console.log(obj.age);
                console.log(obj.sex);
                console.log(querystring.stringify(obj)); //*************
                response.end('success');
            });
    
        }
    
    • path
    // 路径的扩展名
    var extendName = path.extname(pathname);  // 输入的pathname点后面的扩展名
    
    • fs
    fs.stat("./album/ccc", function (err, stats) {
        // 检查path是不是一个目录
        console.log(stats.isDirectory());
    });
    

    node.js中的回调函数

    node中的函数大多都是通过回调调用函数的,所以在使用时要注意先确定数据拿到后再调用回到函数。要注意node非阻塞的特性。

    node.js中的输出与使用

    // 1.输出
    // 在文件a.js中定义好方法,如果想外面的模块可以使用该方法,就需要将该方法暴露出去。
    exports.methodName = function(){
      
    }
    
    // 2.引用
    // 外面的模块想使用a.js文件中的函数,就要引用a.js文件
    var a = require('./a.js');  // 引入。相对自身找到其他的文件
    a.methodName();             // 使用方法
    
    
    // 3.输出的第二种方法
    // 直接将对象输出
    module.exports = {
        "key1": "value1",
        "key2": "value2",
        "key3": "value3",
        "key4": "value4"
    }
    

    cookie

    什么是cookie?

    cookie是发送请求时一起和请求报文发送到服务器的字符串

    cookie的作用?

    可以根据cookie记录用户的喜好和登陆状态等

    结束小菊花

    • express中使用res.send("提示");
    • 原生node.js使用res.end("提示");

    作用域注意事项:

    1. 在浏览器中,顶层作用域就是全局作用域。这意味着在浏览器中,var something 会定义一个新的全局变量。在Node.js 中则不同,顶层作用域不是全局作用域,var something 的作用域只在模块内。

    npm 包(常用-------------------

    formidable

    • 上传文件时使用的包

    ejs与jade

    • 使用模板引擎时引入的包

    body-parser

    • 发送get请求时不需要该包
    • 发送post请求时需要用该包获取response.body对象

    express

    • express相当于JavaScript与jquery的关系中的jquery

    underscore

    • 可以使用template功能填充模板数据

      // 使用步骤
      // 1.下载underscore.js文件
      // 2.引入underscore.js文件
      // 3.设置模块
      // 4.从服务中获取json数据,将数据填充到模板中
      

    mongooses

    • 数据库的建模工具模块,可以建立存在数据库里面的模板样式

    moment

    相关文章

      网友评论

        本文标题:node.js笔记

        本文链接:https://www.haomeiwen.com/subject/tseckftx.html