• node


    sublime配置安装

    EventEmitter 提供了多个属性,如 on 和 emiton 函数用于绑定事件函数,emit 属性用于触发一个事件。

    Buffer类:

      javaScript只有字符串数据类型,没有二进制。处理TCP流或者文件流时,需要二进制数据,所以定义了Buffer类,作为专门存放二进制数据的缓存区。

    用一下功能,并没有测试对错
    var a = new BUffer(50).write("hello doubi", 0, 12, 'utf8');
    var b = a.toString('utf8', 1, 3);
    var c = buf.toJSON(Buffer.concat(a, b));
    var d = a.compare(b);
    var e = buf.copy(a, 1, 1, 2);
    slice length..

    Stream:抽象接口,比如对http服务器发起请求的Request对象,比如stdout。

          Stream有可读操作、可写操作、可读可写操作、操作被写入数据读出结果四种流类型。

         都是EventEmitter的实例,常见事件有data、end、error、finish四种事件

         eg:createReadStream、createWriteStream、createGzip、createGunzip

    模块: 使文件相互调用,使nodejs的基本组成,模块与文件一一对应,比如js文件、json、编译过的c/c++扩展

    //注意引用一致
    var a = require('./hello');
    hello = new a();

    两种用法

    提供访问接口
    hello.js:
    exports.Hello = function(){};
    test1.js:
    require('hello').hello();
    
    提供封装对象
    hello.js
    Hello = function(){};
    module.exports = hello;
    test1.js:
    var a = require('./hello');
    var b = new Hello();

    模块加载优先级:读缓存 > 读原生模块 > 读扩展名载入文件模块(包装编译,读取后载入缓存)

     函数:

    1、实现函数、接口函数,调用
    function say(str) {
      console.log(str);
    }
    
    function execute(func, value) {
      func(value);
    }
    execute(say, "Hello");
    
    
    2、接口函数匿名,当场调用
    function excute(func, val){
       func(val);
    };
    
    excute(function(str) {
       console.log(str);
    }, 'hello');

     路由router:

    比较难懂待完成

    向路由提供请求的URL和GET及POST参数,
    路由据此执行代码。
    所有数据包含在request对象中,也即onRequest()回调函数的第一个参数。
    解析数据,用到url和querystring模块。
    
                         url.parse(string).query
                                               |
               url.parse(string).pathname      |
                           |                   |
                           |                   |
                         ------ -------------------
    http://localhost:8888/start?foo=bar&hello=world
                                    ---       -----
                                     |          |
                                     |          |
                  querystring(string)["foo"]    |
                                                |
                             querystring(string)["hello"]

     Global全局对象:

    //1
    console.log( __filename);
    console.log( __dirname);
    
    function Hello() {
        console.log("hi world!");
    }
    
    console.time("在我弟盼着");
    Hello();
    console.timeEnd("在我弟盼着");
    console.info("程序结束
    ");
    
    console.trace();//打印堆栈消息
    // console.assert(false, "hehe");
    
    //2
    /*exit beforeExit uncaughtException Signal 
    退出状态码:1 Uncaught Fatal Exception 2 Unused*/
    process.on('exit', function(code) {
    
      // 以下代码永远不会执行
      setTimeout(function() {
        console.log("该代码不会执行");
      }, 0);
      
      console.log('退出码为:', code);
    });
    console.log("程序执行结束");
    
    //3 
    /*Process属性:stdout stderr stdin argv execPath execArgv env
    exitCode version versions config pid title arch platform mainModule*/
    process.stdout.write("hell guys
    ");
    process.argv.forEach( function(val, index, array) {
        console.log(index + ": " + val);
    })
    
    console.log(process.execPath);
    
    console.log(process.mainModule);
    
    //4
    /*abort chdir cwd exit getgid setgid getuid setuid getgroups 
    setgroups initgroups kill memoryUsage nextTick umask uptime hrtime*/
    // 输出当前目录    
    console.log('当前目录: ' + process.cwd());
    
    // 输出当前版本
    console.log('当前版本: ' + process.version);
    
    // 输出内存使用情况
    console.log(process.memoryUsage());
    View Code

    util:常用工具

    util.inherits(sub, base)
    Sub仅仅继承了Base 在原型中定义的函数,而构造函数内部创造的属 性和函数没有被继承。
    
    util.inspect(pes, true)
    将对象转换为字符串,可以查看结构
    
    isArray isRegExp isDate isError
    View Code

     fs:文件系统

    文件系统
    
    var fs = require("fs");
    
    fs.readFile('input.txt', function(err, data){}});
    
    fs.readFileSync('input.txt'));
    
    fs.open(path, flags[, mode], callback)
    
    fs.stat(path, callback)判断是否是。。
    //tats.isFile()  isDirectory  isSocket
    
    fs.writeFile(filename, data[, options], callback)
    //options包含 {encoding, mode, flag}。默认为utf8,0666,'w'
    
    fs.ftruncate(fd, len, callback)
    
    fs.unlink(path, callback)
    
    mkdir readdir rmdir rename ftruncate ftruncateSync
    chown  access用户权限
    View Code

    get/post

    var http = require('http');
    var url = require('url');
    var util = require('util');
    
    http.createServer(function(req, res){
        res.writeHead(200, {'Content-Type': 'text/plain'});
        res.end(util.inspect(url.parse(req.url, true)));
    }).listen(3000);
    
    /*http://localhost:3000/user?name=w3c&email=w3c@w3cschool.cc
      Url {
      protocol: null,
      slashes: null,
      auth: null,
      host: null,
      port: null,
      hostname: null,
      hash: null,
      search: '?name=w3c&email=w3c@w3cschool.cc',
      query: { name: 'w3c', email: 'w3c@w3cschool.cc' },
      pathname: '/user',
      path: '/user?name=w3c&email=w3c@w3cschool.cc',
      href: '/user?name=w3c&email=w3c@w3cschool.cc' }*/
    
      http.createServer(function(req, res){
        var post = '';     //定义了一个post变量,用于暂存请求体的信息
    
        req.on('data', function(chunk){    //通过req的data事件监听函数,每当接受到请求体的数据,就累加到post变量中
            post += chunk;
        });
    
        req.on('end', function(){    //在end事件触发后,通过querystring.parse将post解析为真正的POST请求格式,然后向客户端返回。
            post = querystring.parse(post);
            res.end(util.inspect(post));
        });
    }).listen(3000);
    View Code

    nodejs工具模块

    var os = require("os")
    os.tmpdir endianness hostname type platform arch release
    uptime loadavg totalmem freemem cpus networkInterfaces
    
    var path = require("path")
    normalize join resolve isAbsolute relative dirname 
    basename extname parse format
    
    domain模块: 简化异步代码的异常处理,可以捕捉处理try catch无法捕捉的异常
    把不同的IO操作作为一个组,注册时间会掉到domain,发生错误或者抛出一个错误,domain对象会被通知,不会丢失上下文环境,也不导致错误立即推出。
    domain.create add remove run(隐式绑定) dispose eixt  bind intercept enter members
    
    var dns = require("dns")
    var dns = require("dns");
    
    dns.lookup('www.github.com', function onLookup(err, address, family) {
        console.log('ip 地址:', address);
        dns.reverse(address, function (err, hostnames) {
            if (err) {
                console.log(err.stack);
            } else {
                console.log('反向解析' + address +":" + JSON.stringify(hostnames));
            }
        })
    });
    
    lookup lookupService resolve resolve4 reverse解析 getServers resolveTxt resolveSoa resolveNs
    View Code

    4、多进程
      Nodejs单线程运行,事件驱动利于多cpu多进程,提高性能。每个子进程有child.stdin,child,stdout,child.stderr。Node提供了child_process创建子进程,方法有exec(使用子进程执行命令,缓存子进程输出)、spawn(使用指定命令行参数创建新进程)、fork(spawn的特殊形式)

    child_process.exec(command[, options], callback)

    //support.js
    console.log("进程 " + process.argv[2] + " 执行。");
    
    //master.js
    const fs = require('fs');
    const child_process = require('child_process');
    
    for(var i=0; i<3; i++) {
       var workerProcess = child_process.exec('node support.js ' +i, errStdout);
    
       workerProcess.on('exit', function(code) {
          console.log('子进程已退出,退出码 ' + code);
       })
    };
    
    function errStdout(error, stdout, stderr) {
       if(error) {
          console.log(error.stack());
          console.log('Error code: ' + error.code);
          console.log('Signal received: ' + error.signal);
       } else {
          console.log('stdout: ' + stdout);
          console.log('stderr: ' + stderr);
       }
    };
    View Code

     child_process.spawn(command[, args][, options])

    spawn() 方法返回流 (stdout & stderr),在进程返回大量数据时使用。进程一旦开始执行时 spawn() 就开始接收响应。

    //master.js
    const fs = require('fs');
    const child_process = require('child_process');
    
    for(var i=0; i<3; i++) {
       var workerProcess = child_process.spawn('node', ['support.js', i]);
    
       workerProcess.stdout.on('data', function(data) {
          console.log('stdout: ' + data);
       });
    
       workerProcess.stderr.on('data', function(data) {
          console.log('stderr:' + data);
       })
    
       workerProcess.on('close', function(code) {
          console.log('子进程已退出,退出码 ' + code);
       })
    };
    View Code

     child_process.fork(modulePath[, args][, options])

    //master.js
    const fs = require('fs');
    const child_process = require('child_process');
    
    for(var i=0; i<3; i++) {
       var workerProcess = child_process.fork('test1.js', [i]);
    
       workerProcess.on('close', function(code) {
          console.log('子进程已退出,退出码:' + code);
       })
    };
    View Code

    3、Express框架
    npm install express --save
    //node.js 中间件,用于处理 JSON, Raw, Text 和 URL 编码的数据。
    body-parser
    //这就是一个解析Cookie的工具。通过req.cookies可以取到传过来的cookie,并把它们转成对象。
     cookie-parser
    中间件,用于处理 enctype="multipart/form-data"(设置表单的MIME编码)的表单数据。
    npm install multer --save

    app.get('/', function (req, res) {
       // --
    })
    
    request 和 response 对象的具体介绍:
    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.accpets():检查请求的Accept头的请求类型
    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类型
    View Code

     router路由指定脚本响应客户端要求

    var express = require("express");
    var app = express();
    
    app.get('/', function (req, res) {
       console.log("主页 GET 请求");
       res.send('Hello GET');
    })
    
    //can't
    app.post('/', function (req, res) {
        console.log("主页post请求");
        res.send("helo post");
    })
    
    //can't
    app.delete('/del_user', function (req, res) {
        console.log('delete请求');
        res.send('删除页面');
    })
    
    app.get('/list_user', function (req, res) {
        console.log('listusers 请求');
        res.send('用户列表页面');
    })
    
    app.get('/ab*cd', function (req, res) {
        console.log('get请求');
        res.send('正则匹配');
    })
    
    var server = app.listen(8081, function () {
    
      var host = server.address().address
      var port = server.address().port
    
      console.log("应用实例,访问地址为 http://%s:%s", host, port)
    
    })
    View Code

    Express的内置中间件express.static来设置静态文件

    //http://127.0.0.1:8081/image/logo.png
    app.use(express.static('public'));
    View Code

    get方法

    //index.htm
    <html>
    <body>
    <form action="http://127.0.0.1:8081/process_get" method="GET">
    First Name: <input type="text" name="first_name">  <br>
    
    Last Name: <input type="text" name="last_name">
    <input type="submit" value="Submit">
    </form>
    </body>
    </html>
    
    //test1.js
    var express = require('express');
    var app = express();
    
    //http://127.0.0.1:8081/image/logo.png
    app.use(express.static('public'));
    
    app.get('/', function (req, res) {
        res.send('hello world');
    })
    
    app.get('/index.htm', function (req, res) {
        //sendFile是文档流吗
        res.sendFile( __dirname + '/' + 'index.htm');
    })
    
    app.get('/process_get', function (req, res) {
        
        //输出JSON格式
        response = {
            firse_name:req.query.first_name,
            last_name:req.query.last_name
        }
        console.log(response);
        res.end(JSON.stringify(response));
    })
    
    var server = app.listen(8081, function () {
    
      var host = server.address().address
      var port = server.address().port
    
      console.log("应用实例,访问地址为 http://%s:%s", host, port)
    
    })
    View Code

    post方法

    //index.htm
    <html>
    <body>
    <form action="http://127.0.0.1:8081/process_post" method="POST">
    First Name: <input type="text" name="first_name">  <br>
    
    Last Name: <input type="text" name="last_name">
    <input type="submit" value="Submit">
    </form>
    </body>
    </html>
    
    //test1.js
    var express = require('express');
    var app = express();
    var bodyParser = require('body-parser');
    
    var urlencodedParser = bodyParser.urlencoded({ extended: false});
    
    //http://127.0.0.1:8081/image/logo.png
    app.use(express.static('public'));
    
    app.get('/', function (req, res) {
        res.send('hello world');
    })
    
    app.get('/index.htm', function (req, res) {
        //sendFile是文档流吗
        res.sendFile( __dirname + '/' + 'index.htm');
    })
    
    app.post('/process_post', urlencodedParser, function (req, res) {
        
        //输出JSON格式
        response = {
            first_name:req.body.first_name,
            last_name:req.body.last_name
        }
        console.log(response);
        res.end(JSON.stringify(response));
    })
    
    var server = app.listen(8081, function () {
    
      var host = server.address().address
      var port = server.address().port
    
      console.log("应用实例,访问地址为 http://%s:%s", host, port)
    
    })
    View Code

    upload

    //有问题会报错还需调试
    //index.htm
    <html>
    <body>
    <h3>文件上传:</h3>
    选择一个文件上传:<br/>
    <form action="/file_upload" method="POST" unctype="multipart/form-data">
    <input type="file" name="image" size="50"/><br/>
    <input type="submit" name="上传文件">
    </form>
    </body>
    </html>
    
    ///
    
    var express = require('express');
    var app = express();
    var fs = require("fs");
    var bodyParser = require('body-parser');
    var multer = require("multer");
    
    app.use(express.static('public'));
    app.use(bodyParser.urlencoded({ extended: false}));
    app.use(multer({ dest: '/tmp/'}).array('image'));
    
    app.get('/index.htm', function (req, res) {
        //sendFile是文档流吗
        res.sendFile( __dirname + '/' + 'index.htm');
    })
    
    app.post('/file_upload', function (req, res) {
        console.log(req.files[0]);    //上传的文件信息
    
        var des_file = __dirname + '/' + req.files[0].originalname;
        fs.readFile( req.files[0].path, function (err, data) {
            fs.writeFile(des_file, data, function (err) {
                if (err) {
                    console.log(err);
                    res.end(err);
                } else {
                    response = {
                        message: 'File uploaded successfully',
                        filename:  req.files[0].originalname 
                    };
                    console.log(response);
                    res.end(JSON.stringify( response ));
                }
            })
        });
    })
    
    var server = app.listen(8081, function () {
    
      var host = server.address().address
      var port = server.address().port
    
      console.log("应用实例,访问地址为 http://%s:%s", host, port)
    
    })
    View Code

     cookies

    //可能有问题,没整明白
    var express = require("express")
    var cookieParser = require("cookie-parser")
    
    var app = express()
    app.use(cookieParser)
    
    app.get('/a', function (req, res) {
        console.log("Cookies:", req.cookies)
    })
    
    app.listen(8081)
    View Code

    2、REST

      RESTful API(Representational State Transfer表述性状态传递),REST通常基于使用HTTP,URI,XML以及HTML这些广泛流行的协议和标准,通常使用JSON数据格式。
      四个方法:  get获取~数据     put添加~      delete删除~      post更新或添加~

    //server.js
    //RESTful API @fanyu20160620
    //问题没解决:1、deleteUser无法注册 2、新增可以显示,但是没有实际更新
    
    /*序号    URI            HTTP方法    发送内容    结果
        1    listUsers    GET            空            显示所有用户列表
        2    addUser        POST        JSON字符串    添加新用户
        3    deleteUser    DELETE        JSON字符串    删除用户
        4    :id            GET            空            显示用户详细信息*/
    var express = require('express');
    var app = express();
    var fs = require("fs");
    
    //添加新用户1/2
    var user = {
        "user4": {
            "name" : "miaomiaoTobe",
            "password" : "password1",
            "profession" : "Web Representation",
            "id" : 4
        }
    };
    
    //添加新用户 /addUser
    app.get('/addUser', function(req, res) {
        fs.readFile( __dirname + "/" + "users.json", "utf8", function(err, data) {
            
            data = JSON.parse(data);
            console.log(data);
            data['user4'] = user["user4"];
            
            res.end(JSON.stringify(data));
            console.log(data);
        });
    });
    
    //显示所有用户列表 /listUsers
    app.get('/listUsers', function(req, res) {
        fs.readFile( __dirname + "/" + "users.json", "utf8", function(err, data) {
            console.log(data);
            res.end(data);
        });
    });
    
    //显示用户详细信息 /2
    app.get('/:id', function (req, res) {
        fs.readFile( __dirname + '/' + 'users.json', 'utf8', function (err, data) {
            data = JSON.parse(data);
            
            var user = data["user" + req.params.id];
            console.log(JSON.stringify(user));
            res.end(JSON.stringify(user))
        });
    });
    
    //删除用户/deleteUser
    app.get('/deleteUser', function (req, res) {
        fs.readFile( __dirname + '/' + 'users.json', 'utf8', function (err, data) {
            data = JSON.parse(data);
    
            delete data["user" + 2];
            console.log(data);
            res.end( JSON.stringify(data) );
        });
    });
    
    //监听8081端口
    var server = app.listen(8081, function() {
        var host = server.address().address;
        var port = server.address().port;
    
        console.log("应用实例,访问地址为 http://%s:%s", host, port);
    });
    
    //users.json
    {
        "user1": {
            "name" : "miaomiao1",
                "password" : "password1",
                "profession" : "teacher",
                "id" : 1
        },
        "user2": {
            "name" : "miaomiao2",
                "password" : "password2",
                "profession" : "librarion",
                "id" : 2
        },
        "user3": {
            "name" : "miaomiao3",
                "password" : "password3",
                "profession" : "clerk",
                "id" : 3
        }
    }
    View Code

    1、JXcore 打包

      nodejs是开放源代码,跨平台、用于服务器端和网络应用的运行环境。JXcore是一个支持多线程的Nodejs发行版本,基本不需要对现有代码任何改动就能线程安全的多线程运行。http://0x9.me/pcj8E

  • 相关阅读:
    黑客无处不在
    微博对我的影响
    WPF Chart DynamicDataDisplay的横坐标显示日期的解决方案
    java虚拟机中的字节码
    python解释器的使用
    Python学习环境设置
    变量的概念
    创建虚拟环境和常用包
    第三章笔记
    第一章笔记
  • 原文地址:https://www.cnblogs.com/tabCtrlShift/p/5591683.html
Copyright © 2020-2023  润新知