文档笔记----nodejs菜鸟教程

<html>

<head>
    <meta charset="utf-8">
    <title>文档笔记----nodejs菜鸟教程</title>
    <meta name="keyword" content="文档笔记----nodejs菜鸟教程">
    <meta name="discription" content="文档笔记----nodejs菜鸟教程">
</head>

<body>
    <script>
    文档笔记-- --nodejs菜鸟教程

    第一章 创建第一个应用
    如果我们使用PHP来编写后端代码是时, 需要Apache或者Nginx服务器, 并且配上mod_php5模块和php_cgi.
    使用nodejs时, 我们不仅仅在实现一个应用, 同时还实现了整个HTTP服务器.事实上, 我们的Web应用以及对应的web服务器基本是一样的

    1 引入require模块: 用来载入node.js模块
    var http = require("http");
    2 创建服务器: 服务器可以监听客户端的需求, 类似Apache / Nginx等HTTP服务器
    3 接受请求与响应请求 拂去其端可以使用浏览器或者终端发送HTTP请求, 服务器接受请求后返回相应数据.
    http.createServer(function(request, response) {
        //内容类型
        response.writeHead(200, { "Content-Type": "text/plain" });
        //发送响应式请求
        response.end("Hello World\n");
    }).listen(8888);

    第二章 NPM使用
    NPM是随同Nodejs一起安装的包管理工具, 能解决Nodejs代码部署上的很多问题, 常见的使用场景有以下几种:
        1 允许用户从NPM服务器下载被别人编写的三方包到本地使用
    2 允许用户从NPM服务器下载并安装别人编写的命令程序到本地使用
    3 允许用户将自己编写的包或者命令程序上传到NPM服务器供别人使用

    查看版本
    npm - v

    全局安装npm
    npm install npm - g

    安装express到本地
    npm install express

    卸载express
    npm uninstall express

    查看安装路径
    npm ls

    更新express模块
    npm update express

    创建模块
    npm init


    第三章 Node.js REPL(交互式解释器)

    Node自带交互式解释器, 可以至此那个一下任务:
        1 读取 - 读取用户输入, 解析输入的javascript数据结构并且存储在内存中
    2 执行 - 执行输入的数据结构
    3 打印 - 输出结构
    4 循环 - 循环操作以上步骤直到用户量词按下ctrl + c按钮退出

    下划线(_) 变量
        -- > 获取表达式运算结果

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


    第四章 Node.js 回调函数

    Node.js异步编程的直接提现说就是回调函数

    异步编程依托于回调函数, 但不能说使用了回调函数就能是异步编程

    阻塞代码实例:
        var fs = require("file");
    var data = fs.readFileSync("input.txt");
    console.log(data.toString());
    console.log("程序执行结束");


    非阻塞代码实例:
        var fs = require("file");
    fs.readFile("input.txt", function(err, data) {
        if (err) {
            return console.error(err);
        } else {
            console.log(data.toStrign());
        }
    })

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


    第五章 Node.js EventEmitter
    Node.js所有的异步I / O操作在完成是都会发送到事件队列
    events只提供了events.EventEmitter 这一个对象
    核心就是事件触发与事件监听功能的封装

    //引入events模块
    var events = require("event");
    //创建eventsEmitter对象
    var eventEmitter = new events.EventEmitter();
    //绑定事件
    event.on("some_event", function() {
        console.log("some_event触发");
    })
    //触发事件
    event.emit("some_event");

    第六章 Buffer(缓冲区)
    javascript语言自身只有字符串数据类型, 没用二进制数据类型

    但在处理像TCP流或者文件流时, 必须使用到二进制数据.因此在Node.js中, 定义了一个Buffer类,
        该类用来创建一个专门存放二进制数据的缓存区

    一个Buffer类似一个整数数组, 但他对应于V8堆内存之外的一块原始内容

    var buf = new Buffer(10) //按长度创建

    var buf = new Buffer([10, 20, 30, 40, 50]) //按给定的数组创建

    var buf = new Buffer("www.runob.com", "utf-8"); //通过一个字符串创建

    写入缓冲区
    buf.write() //返回字节数

    从缓冲区读数据
    buf.toString() //返回数据字符串

    转为JSON对象
    buf.toJSON();

    合并缓冲区
    buffer.concat(buf1, buf2, ..); //

    缓冲区比较
    buf1.compare(buf2); //

    缓冲区裁剪
    buf.slice();

    缓冲区长度
    buf.length

    第七章 Node.js Stream(流)

    Stram是一个抽象接口, Node中有很多对象实现了这个接口.例如, 对http服务器发起的request对象就是一个Stream, 还有stdout(标准输出)
    分类:
        1 readable 可读操作
    2 writable 可写操作
    3 duplex 可读可写操作
    4 transform 操作别写入数据, 然后读出结果

    所有的Stream对象都是EventEmitter对象
    data: 当有数据可读时触发
    end: 没有更多的数据可读时触发
    error: 在接收和写入过程中发生错误时触发
    finish: 所有数据已被写入到底层系统时触发


    从流中读取数据
    var fs = require("file");
    var data = '';
    //创建可读流
    var readerStream = fs.createReadStream("input.txt");
    //设置编码
    readerStream.setEncoding("UTF8");
    //处理流事件
    readerStream.on("data", function(chunk) {
        data += chunk;
    })

    readerStream.on("end"function() {
        console.log(data);
    })

    readerStream.on("error", function(err) {
        console.log(err.stack);
    })
    console.log("程序执行完毕");

    写入流
    var fs = require("file");
    var data = "324324324";

    var writerStream = fs.createWriteStream("output.txt");

    writerStream.write(data, "UTF8");

    writerStream.end();

    writerStream.on("finish", function() {
        console.log("写入完成");
    })
    writerStream.on("error", function(err) {
        console.log(err.stack);
    })

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

    第八章 Node.js函数

    匿名函数: 我们可以把一个函数作为变量传递.但是我们不一定要绕这个 "先定义,再传递"
    的圈子,
    我们可以直接在另一个函数的括号中定义和传递这个函数
    execute(function(word) {
        console.log(word);
    })

    第九章 Node.js模块系统

    为了让Node.js的文件可以相互调用, Node.js提供了一个简单的模块系统.
    模块是Node.js应用程序的基本组成部分, 文件和模块是一一对应的.换言之, 一个Node.js文件就是一个模块

    //func.js
    experts.func = function() {

    }

    module.experts = function() {

    }

    var f = require("func");

    //引入的时候前者 f.func();后者 f();
    模块加载优先级

    开始require - > 是否在文件模块缓存区中 - > 否 - > 是否原生模块 - > 否 - > 查找文件模块 - > 根据扩展名载入文件模块 - > 返回experts
    是 - > 返回experts -
        >
        是 - > 是否在原生模块缓存区中 - > 否 - > 加载原生模块 - > 缓存原生模块 - > 返回experts



    第十章 GET / POST

    GET:
        var url = require("url");

    POST:
        var querystring = require("querystring");

    第十二章 Node.js常用工具
    util是一个Node.js核心模块, 提供常用函数的集合, 用于弥补核心javascript的功能过于精简的不足
    util.inherits() 是一个实现对象间原型继承的函数.
    var util = require("util");

    function Base() {

    }
    Base.prototype.showName = function() {

    }

    util.inherits(Sub, Base);
    var sub = new Sub();

    //Sub仅仅继承了Base在原型中定义的函数,而构造函数内部的属性和函数都咩有被Sub继承

    util.inspect();
    //将任意对象转为字符串的方法

    util.isArray()
    //判断传入对象是否为数组

    util.isRegExp()
    //判断传入参数是否为正则

    util.isDate()
    //判断传入参数是否为日期

    util.isError();
    //判断是否为一个错误的对象


    第十三章 Node.js工具模块

    OS模块
    Path模块
    Net模块
    DNS模块
    Domain模块


    第十四章 Node.js路由

    路由可以通过请求的URL路径来区别不同请求, 这是通过路由讲请求以url路径为基准映射到处理程序上


    第十五章 Node.js全局对象
    javacript中有一个特殊的对象, 它及其所有属性都可以在程序的任何地方访问
    最外层定义的变量
    全局随想的属性
    隐式定义的变量

    __filename
    __dirname

    setTimeout();
    clearTimeout();
    serInterval();
    clearInterval();

    console

    process
    //用于描述当前Node.js进程状态对象,提供了一个与操作系统的简单接口


    第十六章 Node.js文件系统

    //异步读取文件
    readFile(); //异步

    //同步读取文件
    readFileSync(); //同步
    建议使用异步, 比起同步, 异步方法性能更高, 而且没有阻塞

    var fs = require("fs");


    fs.readFile("input.txt", function(err, data) {
        if (err) {
            console.error(err.stack);
        } else {
            console.log(data.toString());
        }
    })

    var data = fs.readFileSync("input.txt");
    console.log(data.toString());


    fs.open("input.txt", function(err, fd) {

    })


    fs.read(fd, buf, 0, buf.length, 0, function(err, bytes) {

    })
    stats

    //异步写入文件
    fs.writeFile("input.txt", "xiruneirong", function(err) {

    })

    //关闭文件
    fs.close();

    //截取文件
    fsftruncate(fd, 10, function(err) {

    })

    //删除文件
    fs.unlink("input.txt", function(err) {

    })

    //创建目录
    fs.mkdir("dir", function(err) {

    })

    //读取目录
    fs.readdir(dir, function(err, files) {
        if (err) {
            return console.error(err);
        }
        files.forEach(function(file) {
            console.log(file);
        })
    })

    //删除目录
    fs.rmdir(dir, function() {

    })

    第十七章 Nodejs Express 框架

    快速打算建一个完整的网站
    Express框架核心特点:
        1 可以设置中间件来响应http请求
    2 定义了路由变用于执行不同的HTTP请求
    3 可以通过向模板传递参数来动态渲染HTML页面


    var express = require("express");
    var app = express();
    app.get("/", function(req, res) {
        res.send();
    })
    app.post('/', function(req, res) {
        console.log("主页 POST 请求");
        res.send('Hello POST');
    }) // /del_user 页面响应
    var server app.listen(8888, function() {

    })

    Request 对象 - request 对象表示 HTTP 请求, 包含了请求查询字符串, 参数, 内容, HTTP 头部等属性。 常见属性有:
    req.app: //当callback为外部文件时, 用req.app访问express的实例
    req.baseUrl: 获取路由当前安装的URL路径
    req.body / req.cookies: 获得「 请求主体」 / Cookies
    req.fresh / req.stale: 判断请求是否还「 新鲜」
    req.hostname / req.ip: 获取主机名和IP地址
    req.originalUrl: 获取原始请求URL
    req.params: 获取路由的parameters
    req.path: 获取请求路径
    req.protocol: 获取协议类型
    req.query: 获取URL的查询参数串
    req.route: 获取当前匹配的路由
    req.subdomains: 获取子域名
    req.accepts(): 检查可接受的请求的文档类型
    req.acceptsCharsets / req.acceptsEncodings / req.acceptsLanguages: 返回指定字符集的第一个可接受字符编码
    req.get(): 获取指定的HTTP请求头
    req.is(): 判断请求头Content - Type的MIME类型
    Response 对象 - response 对象表示 HTTP 响应, 即在接收到请求时向客户端发送的 HTTP 响应数据。 常见属性有:
    res.app: 同req.app一样
    res.append(): 追加指定HTTP头
    res.set() 在res.append() 后将重置之前设置的头
    res.cookie(name, value[,option]): 设置Cookie
    opition: domain / expires / httpOnly / maxAge / path / secure / signed
    res.clearCookie(): 清除Cookie
    res.download(): 传送指定路径的文件
    res.get(): 返回指定的HTTP头
    res.json(): 传送JSON响应
    res.jsonp(): 传送JSONP响应
    res.location(): 只设置响应的Location HTTP头, 不设置状态码或者close response
    res.redirect(): 设置响应的Location HTTP头, 并且设置状态码302
    res.send(): 传送HTTP响应
    res.sendFile(path[,options][,fn]): 传送指定路径的文件 - 会自动根据文件extension设定Content - Type
    res.set(): 设置HTTP头, 传入object可以一次设置多个头
    res.status(): 设置HTTP状态码
    res.type(): 设置Content - Type的MIME类型



    第十八章 RESFUL API

    表述性状态传递



    第十二章 多进程
    nodejs是单线程的模式运行, 事件驱动处理并发,
    这样有助于我们在多核cpu的系统上创建多个子进程, 从而提高性能

    const fs = require("fs");
    const child_process = require("child_process");
    for (var i = 0; i < 3; i++) {
        var worker_process = child_process.fork("support.js".[i]);
        worker_process.on("close", function(code) {

        })

        第二十一章 mysql
        var mysql = require("mysql");
        var connection = mysql.createConnection({
            host: "127.0.0.1",
            user: "root",
            password: "",
            database: "test"
        })
        connection.query("select....", function(err, res, fields) {

        })
    }

    第二十二章 MongoDB
    var MongoClient = require('mongodb').MongoClient;
    var DB_CONN_STR = 'mongodb://127.0.0:27017/test';
    var insertData = function(db, callback) { //连接到表 site var collection = db.collection('site'); //插入数据 
        var data = [{ "name": "1221", "url": "www.hao123.com" },
            { "name": "32132", "url": "c.baidu.com" }
        ];
        collection.insert(data, function(err, result) {
            if (err) {
                console.log('Error:' + err);
                return;
            }
            callback(result);
        });
    }
    MongoClient.connect(DB_CONN_STR, function(err, db) {
        console.log("连接成功!");
        insertData(db, function(result) {
            console.log(result);
            db.close();
        });
    });
    </script>
</body>

</html>

  

posted @ 2018-03-31 12:01  SunLike阿理旺旺  阅读(1031)  评论(0编辑  收藏  举报