• nodejs 基础学习笔记


    单线程 单进程 非阻塞 事件驱动。

    句柄就是函数

    事件驱动模型

    事件源-》触发事件《-》监听事件程序-》事件处理程序

    路径的要求不严格

    node的知识点:

    1. node的http模块,

    var http = require('http');

    http.createServer(function(req, res){

      res.writeHeader(200, {'Content-Type': 'text/plain'});         //写入文件头

      res.end('Hello World!');  //浏览器中的输出

    }).listen('8888');

    2. fs模块的方法

    可以读取文件、文件夹,创建删除文件、文件夹,截取文件内容,修改权限、群组等,用的时候再看吧,这里会用到buffer,具体的不清楚呢?

    读取文件模块 readFile,readFileAync

    var fs = require('fs');

    fs.readFile('input.txt', function(err, data){  //异步读取文件

      console.log(data);

    })

    var data = fs.readFileAync('input.txt');   //同步读取文件

    console.log(data);

    fs的stream流, createReadStream(),  createWriteStream()

    var fs = require('fs');

    var data = '';

    var readStream = fs.createReadStream('input.txt');  //这个异步执行的, 按顺序放到事件执行队列中

    readStream.on('data', function(chunk){

      data += chunk;

    })

    readStream.on('end', function(){

      console.log(data);

    })

    readStream.on('error', function(err){

      console.log(err.stack);

    })

    var writeStream = fs.createWriteStream('input.txt');

    writeStream.end();

    writeStream.on('finish', function(){

      console.log('写入完成');

    })

    writeStream.on('error', function(err){

      console.log(err.stack);

    })

    3. buffer 理解就是一个存储类型,和Array类似,只是可以存储二进制数据,并且可以指定数据格式

    4. events 对象,内部只有一个EmitterEvent方法

    var events = require('events').EventEmitter;

    var eventsEmitter = new events();

    eventsEmitter.on('eventName', functionName);

    eventsEmitter.addListener('eventName', functionName);  //on 和 addListener效果是一样的

    每种方法的添加事件数量默认是10个,如果超过10个会有警告,可以修改这个默认数量

    eventsEmitter.setMaxListeners(21);

    //删除某个监听函数
    eventsEmitter.removeListener('eventName', fnName);
    //删除对象上所有的监听函数
    eventsEmitter.removeAllListeners();
    //删除某类监听函数
    eventsEmitter.removeAllListeners('eventName');
    //监听的数量
    console.log(eventsEmitter.listeners('eventName').length);
    console.log(EventEmitter.listenerCount(eventsEmitter, 'eventName'));
     
    5. node的模块引入和导出
    通过require取得模块,通过exports暴露模块,和es6的语法不同。
    exports暴露模块有两种方式,一种直接写
    exports.sayHello = function(){
      alert(1);
    }
    这种导出的是exports,exports上包含定义的方法,使用方式是
    var hello = require('./hello.js');  //要是用./表示当前目录下, hello相当于exports
    hello.sayHello();
     
    一种是module.exports = function SayName(){
      console.log(3);
    }
    这种导出的是函数本身,使用方法
    var say = require('./hello.js');  //名字可以不一致
    say();
    var say2 = new say();
     
    如果一个文件中暴露多个函数或类呢?
     
    这里涉及到了文件缓存取,原生模块,文件模块,原生模块缓存区?
    这样做的目的是节省内存,防止文件多次被加载
     
     
    6. 路由解析 有两个模块,分别是url模块和querystring
                          url.parse(string).query
                                               |
               url.parse(string).pathname      |
                           |                   |
                           |                   |
                         ------ -------------------
    http://localhost:8888/start?foo=bar&hello=world
                                    ---       -----
                                     |          |
                                     |          |
       querystring.parse(queryString)["foo"]    |
                                                |
                             querystring.parse(queryString)["hello"]
    url有实例方法,有类方法,url.parse()是类方法,
    var  url = require('url');
    var querystring = require('querystring');
    var defaultUrl = 'http://localhost:8888/start?foo=bar&hello=world';
    var query = url.parse(defaultUrl).query;
    var foo = querystring.parse(query)['foo'];
    或者
    var query = url.parse(defaultUrl, true).query;   //第二个参数是true的,会解析成对象形式{foo: bar, hello: world};
    var foo = query.foo;
     
     
     
    7. nodejs的全局对象和全局变量
    global
    __filename ,当前执行文件的绝对路径,包含文件
    __dirname, 当前执行文件的绝对路径,不包含文件
    setTimeout,clearTimeout,setInterval,clearInterval
    console方法
    process对象,有属性,方法,可以读取系统参数,增加结束进程等等
     
    8. util是nodejs的核心模块,提供常用函数的集合
    常用的有
    util.inherits(constructor, superConstructor),是一个实现对象间原型继承的方法。只能继承原型上的方法,对象内的属性和方法不能继承。
    util.inspect(object,[showHidden],[depth],[colors]),将一个对象转换为字符串的方法,通常用于调试和错误输出。

    showHidden 是一个可选参数,如果值为 true,将会输出更多隐藏信息。

    depth 表示最大递归的层数,如果对象很复杂,你可以指定层数以控制输出信息的多 少。如果不指定depth,默认会递归2层,指定为 null 表示将不限递归层数完整遍历对象。 如果color 值为 true,输出格式将会以ANSI 颜色编码,通常用于在终端显示更漂亮 的效果。

    util.isArray(object),如果给定的参数 "object" 是一个数组返回true,否则返回false。

    util.isDate(object),如果给定的参数 "object" 是一个日期返回true,否则返回false。

    util.isRegExp(object),如果给定的参数 "object" 是一个正则表达式返回true,否则返回false。

    util.isError(object),如果给定的参数 "object" 是一个错误对象返回true,否则返回false。

    更多详情可以访问 http://nodejs.org/api/util.html 了解详细内容。

     
    9. post和get 请求
    get直接取url中的参数,
    post监听事件
    var http = require('http');
    var querystring = require('querystring');
    var postHTML = '<html><head><meta charset="utf-8"><title>菜鸟教程 Node.js 实例</title></head>' + '<body>' + '<form method="post">' + '网站名: <input name="name"><br>' + '网站 URL: <input name="url"><br>' + '<input type="submit">' + '</form>' + '</body></html>';
    http.createServer(function (req, res) {
      var body = "";
      req.on('data', function (chunk) {
        body += chunk;
      });
      req.on('end', function () {
        // 解析参数
        body = querystring.parse(body);
        // 设置响应头部信息及编码
        res.writeHead(200, {'Content-Type': 'text/html; charset=utf8'});
        if(body.name && body.url) {
          // 输出提交的数据
          res.write("网站名:" + body.name); res.write("<br>");
          res.write("网站 URL:" + body.url);
        } else {
          // 输出表单
          res.write(postHTML);
        }
        res.end();
      });
    }).listen(3000);
     
    10. nodejs工具模块
    os模块,提供了一些基本的系统操作函数
    var os = require('os');

    console.log('操作系统的默认临时文件夹: ', os.tmpdir());
    console.log(' CPU 的字节序: ', os.endianness());
    console.log('操作系统的主机名: ', os.hostname());
    console.log('操作系统名: ', os.type());
    console.log('操作系统名: ', os.platform());
    console.log('操作系统 CPU 架构: ', os.arch());
    console.log('操作系统的发行版本: ', os.release());
    console.log('操作系统运行的时间,以秒为单位: ', os.uptime());
    console.log('一个包含 1、5、15 分钟平均负载的数组: ', os.loadavg());
    console.log('系统内存总量,单位为字节: ', os.totalmem());
    console.log('操作系统空闲内存量,单位是字节: ', os.freemem());
    console.log('返回一个对象数组,包含所安装的每个 CPU/内核的信息:型号、速度(单位 MHz)、时间(一个包含 user、nice、sys、idle 和 irq 所使用 CPU/内核毫秒数的对象): ', os.cpus());
    console.log('获得网络接口列表: ', os.networkInterfaces());

    这个有些和nodejs的全局对象process功能重合,只是process的是属性,如process.platform
     
    path模块提供了一些用于处理文件路径的小工具,规范化路径,合并路径,转为绝对或相对路径。。
     
    net模块,可以创建服务器,创建客户端,有很多网络相关的方法和属性,这个和http有什么区别呢
    net建立的是TCP服务器(传输层),http建立的是http服务器(应用层),这个还需要深入了解
     
    dns模块,用于解析域名,获取IP地址等
     
    domain模块,简化异步代码的异常处理,可以捕捉try catch无法捕获的异常
    对于事件捕获异常有add和remove
     
     
    web模块指的是http模块,可以写服务器端,也可以写客户端,模拟客户端请求,根据截取的路径请求文件,将文件输出到服务器
     

    Express 是一个简洁而灵活的 node.js Web应用框架, 提供了一系列强大特性帮助你创建各种 Web 应用,和丰富的 HTTP 工具。

    使用 Express 可以快速地搭建一个完整功能的网站。

    Express 框架核心特性:

    可以设置中间件来响应 HTTP 请求。

    定义了路由表用于执行不同的 HTTP 请求动作。

    可以通过向模板传递参数来动态渲染 HTML 页面。

    需要结合三个中间件,分别是body-parser, cookie-parser, multer 

    body-parser - node.js 中间件,用于处理 JSON, Raw, Text 和 URL 编码的数据。

    cookie-parser - 这就是一个解析Cookie的工具。通过req.cookies可以取到传过来的cookie,并把它们转成对象。

    multer - node.js 中间件,用于处理 enctype="multipart/form-data"(设置表单的MIME编码)的表单数据。

    http://www.runoob.com/nodejs/nodejs-express-framework.html

    express的中间件,数据传递怎么传呢
    路由
    res.send();
    res.render();
    res.rediect(); 
    错误处理
     
     
    restful api 是一种设计风格而不是标准

    HTTP 方法
    以下为 REST 基本架构的四个方法:
    GET - 用于获取数据。

    PUT - 用于更新或添加数据。

    DELETE - 用于删除数据。

    POST - 用于添加数据

    还有一个patch只更新服务器上的一个资源的一个属性

    restful的思想可扩展性,并向后兼容,一般使用在url中包含版本信息的方式。

    分析记录优化性能

    状态码304缓存,302重定向

    get和post请求的区别:
    该文章幽默风趣,深入浅出,通俗易懂,是我等写博客需要参考的对象。
     
    nodejs的多进程
     
    JXcore
     
    mysql  和 mongodb
     
    node启动服务的话会有个问题,就是每次修改后需要自己手动再起一次,而supervisor是热启动的工具
    sudo cnpm install supervisor -g 装到全局,用supervisor service.js  即可
      
    swig模版
    https://www.cnblogs.com/dupd/archive/2016/09/22/5895474.html 
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    SAP ALE 事务代码
    jquery插件——仿新浪微博限制输入字数的textarea
    《响应式web设计》读书笔记(五)CSS3过渡、变形和动画
    《响应式web设计》读书笔记(四)HTML5与CSS3
    MySQL 数据类型
    深入理解JavaScript中的this关键字
    SQL Server 存储过程、触发器、游标
    SQL Server 视图
    SQL Server表的创建及索引的控制
    SQL Server 查询语句(二)
  • 原文地址:https://www.cnblogs.com/wenwenli/p/8301975.html
Copyright © 2020-2023  润新知