node

官网

https://nodejs.org/en/html

nodeJs搭建一个简单的服务器

浏览器和服务器通讯须要http协议完成node

    //1 引入http模块
    var http = require('http');
    //2 建立服务器                           请求      响应
    var server = http.createServer(function(request,response){
        console.log('有访问');
        response.write('abc');
        response.end();
    })
    //3 监听8080端口
    server.listen(8080);
    //4 终端输入 node server.js启动服务器
    //5 浏览器测试 localhost:8080 页面虽然无显示,可是控制台中每当有访问会打印 有访问

response 响应给客户端的信息

1 response.write() 会输出到浏览器
2 response.end() 输出结束

request 请求过来的信息 01/request.js

1 request.url 请求过来的url
    localhost:8080/1.html
    /1.html
    /favicon.ico  浏览器自动给你请求的网站小图标

fs 模块

  • 问题一:页面多了,不可能都写在switch case中
  • 问题二:只能响应文字类的东西,没法返回文件
  • 问题三:每次修改都要从新启动服务器

1 readFile(文件名,回调) 02fs/1.js

        fs.readFile('aaa.txt',function(err,data){
            console.log(data);
            //<Buffer 73 66 61 73 6b 6c 66 6a 0a 31 31 31 31 0a 32 32 32 32 0a 33 33 33 33 0a>
            console.log(data.toString());//把二进制转为 字符串
        })

2 writeFile(文件名,内容,回调) 02fs/1.js

        fs.writeFile('bbb.txt','new data',function(err,data){
            console.log(err,'err');
            console.log(data,'data');
        })

fs与服务器结合 02fs/server.js

1 02fs/www 网站根目录,能够外部访问的根目录

        req.url => '/index.html'
        读取 './www/index.html'
        './www'+req.url

        var fileName = './www'+req.url;

2 www/index.html

        <div style="background:red;">
          div
        </div>

3 02fs/server.js

        const http = require('http');
        const fs = require('fs');

        var server = http.createServer(function(req,res){
            var filename = './www' + req.url;
            fs.readFile(filename,(err,data)=>{
                if(err){
                    res.write('404');
                }else{
                    res.write(data);//机器对机器原本就是二进制,因此不用toString
                }
                res.end();
            })
        })

        server.listen(8080);

4 当前服务器问题,须要可以接收到前台发过来的参数

http-解析get参数 03get/server.js 03get/form.html

接收前台的数据请求mysql

  • 前台: form、ajax、jsonp
  • 后台: 同样
  • 前台《---》 后台 :走的都是http协议,对后台而言只是接收到一个http请求

请求方式不一样,接收不一样

1 GET:数据在url中
2 POST:数据不在url中
    请求头 header

    请求体 content  POST数据

queryString 解析查询字符串 03get/queryString.js

    const queryString = require('queryString');
    var json = queryString.parse("username=yuonly&password=123123");
    console.log(json);

url模块 方便的获取地址和get数据 03get/url.js

        const urlLib = require('url');
        //没有第二个参数时
        var obj = urlLib.parse('http://www.zyx58.com/index?a=12&b=5');

        console.log(obj);
        //obj 结果
        Url {
          protocol: 'http:', 协议
          slashes: true,
          auth: null,
          host: 'www.zyx58.com', 主机
          port: null, 端口
          hostname: 'www.zyx58.com', 主机名
          hash: null,
          search: '?a=12&b=5',
          query: 'a=12&b=5',数据
          pathname: '/index',地址
          path: '/index?a=12&b=5',请求路径
          href: 'http://www.zyx58.com/index?a=12&b=5'
        }

        //第二个参数为true时

        var obj = urlLib.parse('http://www.zyx58.com/index?a=12&b=5',true);

        console.log(obj);

        Url {
          protocol: 'http:',
          slashes: true,
          auth: null,
          host: 'www.zyx58.com',
          port: null,
          hostname: 'www.zyx58.com',
          hash: null,
          search: '?a=12&b=5',
          query: { a: '12', b: '5' }, 数据 query已经被解析为json
          pathname: '/index', //地址
          path: '/index?a=12&b=5',
          href: 'http://www.zyx58.com/index?a=12&b=5'
        }

使用url搭建server 来解析请求地址和get参数 03get/urlServer.js

        const http = require('http');

        const urlLib = require('url');

        http.createServer((req,res)=>{
            var obj = urlLib.parse(req.url,true);
            var url = obj.pathname;
            var GET = obj.query;
            console.log(url,GET);
        }).listen(8080);

总结:get参数获取方式 最大 32K

  • 本身动手用 split切
  • queryString 模块
  • url 模块

POST数据获取方式 1G 04post/server.js 04post/form.html

1 on('data',function(data){}) 每当有一段数据到达的时候,就会触发一次
2 on('end',function(){}) 数据彻底到达的时候触发一次
3 数据解析仍然可使用 queryString模块解析
        var http = require('http');
        var queryString = require('queryString');

        http.createServer((req,res)=>{
            //post - req post 数据大,因此要分段发送
            //data 每当有一段数据到达的时候,就会触发一次
            //end 数据彻底到达的时候触发一次
            var str = '';//等待接收数据
            var i = 0;//验证是否分不少次到达
            req.on('data',function(data){
                console.log(`第${i++}次到达`);
                str += data;
            })
            req.on('end',function(){
                // console.log(str);
                var POST = queryString.parse(str);
                console.log(POST);
            })
        }).listen(8080);

server基本内容 05base_server/server.js

        const http = require('http');

        const fs = require('fs');

        const queryString = require('queryString');

        const urlLib = require('url');

        http.createServer((req,res)=>{
            //GET
            var obj = urlLib.parse(req.url,true);
            var url = obj.pathname;
            const GET = obj.query;
            //POST
            var str = '';
            var POST = {};
            req.on('data',function(data){
                str += data;
            })
            req.on('end',function(){

                POST = queryString.parse(str);
                console.log(url,GET,POST);
            })
            // url  要那个文件
            // GET  get数据
            // POST post数据

        // ================ 文件请求======
            var filename = './www'+url;
            fs.readFile(filename,function(err,data){
                if(err){
                    res.write('404');
                }else{
                    res.write(data);
                }
                res.end();
            })

            // localhost:8080/aaa.html


        }).listen(8080);

httpserver 实现用户注册/登陆 06httpserver

1 接口

  • 注册:/user?act=reg&username=aaa&pwd=123 return {"ok":false,"msg":"缘由"} {"ok":true,"msg":"成功信息"}
  • 登陆: /user?act=login&username=aaa&pwd=123

2 对接口的访问 if(url=='/user')

3 对文件的访问 else


模块化 07module

文档 : http://nodejs.cn/api/git

  • 系统模块: http、queryString、url、Crypto-加密、Events-事件、Net-网络操做、OS-操做系统信息、Path-处理文件路径、Stream-流操做、Timer-定时器(interval/timeout)、SSL-加密传输、utils-工具方法、ZLIB-压缩
  • 自定义模块:
  • 模块管理:包管理器

自定义模块

  • 模块组成
  • npm
  • 发布本身的模块

1 模块组成

  • require: 引入模块ajax

    既能够引入系统模块,又能够引入文件模块,因此即使是当前目录也要加上 ./
    
    没有全局变量,至关于
    (function(require,exports,module){
        var a = 12;
        exports.a = 12;
    })()
    
  • exports: 导出、输出。一个一个输出sql

  • module: 模块。批量输出东西npm

    对外输出一堆东西
    exports.a = 12;
    exports.b = 5;
    exports.c = 99;
    
    module.exports = {a:12,b:5,c:99}
    
    console.log(module.exports === exports);//true:说明是一个东西
    

require('./mod1.js') .js能够省略不写json

npm:Nodejs Package Manager(Nodejs包管理器)

  • 统一的下载途径。相似360软件管家
  • 自动下载依赖api

        安装
        npm i mysql --save
        卸载
        npm uninstall mysql
    

npm

1 手动建立node_modules目录
2 把 mod1.js放入 node_modules目录中
3 require('mod1.js'); 能够不加./了

require 1. 若是有 './' 从当前目录找浏览器

  1. 若是没有 ‘./’。首先从系统模块中找,没有,再去node_modules目录中找

发布本身的模块

1 注册帐号
2 登陆
    npm login
    输入用户名、密码、邮箱
3 查看当前登陆的帐号
    npm whoami
4 npm init初始化包信息,会生成package.json
5 发布
    npm publish
6 更新
    npm update test0528
7 删除
    npm unpublish --force
相关文章
相关标签/搜索