首页 > 代码库 > node

node

官网

https://nodejs.org/en/

nodeJs搭建一个简单的服务器

浏览器和服务器通信需要http协议完成

    //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

接收前台的数据请求

  • 前台: 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/

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

自定义模块

  • 模块组成
  • npm
  • 发布自己的模块

1 模块组成

  • require: 引入模块

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

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

    对外输出一堆东西
    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可以省略不写

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

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

        安装
        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目录中找

发布自己的模块

  • 官网: www.npmjs.com
1 注册账号
2 登录
    npm login
    输入用户名、密码、邮箱
3 查看当前登录的账号
    npm whoami
4 npm init初始化包信息,会生成package.json
5 发布
    npm publish
6 更新
    npm update test0528
7 删除
    npm unpublish --force

node