三、node(一)

2017-02-24  本文已影响70人  sheepmiee

Node的安装

把NODE安装后,如果我们没有修改安装的目录,那么默认是安装在:C:\Program Files\nodejs (大部分都是,如果自己修改了安装目录,自己去查找即可)

如果我们安装了NODE,那么它默认会把命令集成到DOS命令中,也就是DOS窗口中可以执行NODE命令

如果没有集成到DOS中,说明环境变量中缺少执行的文件,需要我们配置环境变量:

[WIN7]配置环境变量
我的电脑(右键) -> 高级系统设置 -> 环境变量

系统变量 -> Path -> 把原有的变量值保存一份

把NODE安装的目录添加到原有值的后面,例如:...;C:\Program Files\nodejs\

在把最新的结果重新写入到环境变量值中

Node的基本信息

何为NODE

NODE其实并非后台开发语言,我们了解的JAVA、PHP、C#、.NET(dot net)...才是后台开发语言,NODE仅仅是一个工具,一个基于V8引擎来渲染和解析JS的平台和工具(有点类似浏览器)
真实的开发中,我们一般都把NODE安装在服务器端,这样我们就可以在服务器端编写一些JS代码来处理服务器端的业务逻辑了 =>JS不仅仅可以在客户端浏览器中运行处理客户端业务逻辑(前端开发语言),也可以在服务器端的NODE环境下运行处理服务器端业务逻辑(后台开发语言),所以JS是全栈开发语言

NODE如何去执行JS代码

REPL(Read-Eval-Print Loop,简称REPL,“读取-求值-输出”循环)是一个简单的,交互式的编程环境。
REPL既可以作为独立单机程序,也可以被其他的程序包含在内的程序。
它提供了一种交互方式,即“执行程序,展现结果”。
它可以被用作debugging,testing 或者只是执行操作得到一些结果。

NODE的优势

I/O:input/output 对文件的增删改查操作

学习NODE从模块开始

使用npm安装模块
1、安装到全局(global)
npm install xxx(模块名字) -g
npm uninstall xxx -g 卸载已经安装在全局的模块

2、安装在当前的项目下
npm install xxx(模块名字)

npm uninstall xxx 

把模块安装到全局的问题:

把模块安装在当前的项目中也有问题:

我们平时在做项目开发的时候,首先会在当前项目的根目录下执行:
npm init -y
这样执行完成后,会在当前项目的根目录下生成一个文件:

        package.json       
     {
     "name": "20170222", //->项目名称
     "version": "1.0.0", //->项目的版本号
     "description": "", //->当前项目的描述
     "main": "temp.js", //->当前项目的入口
     "dependencies": {  //->当前项目依赖的第三方模块清单(生产:项目发布上线)
       "less": "^2.7.2"
     },
     "devDependencies": {}, //->当前项目依赖的第三方模块清单(开发:项目正在研发)
     "scripts": {//->命令脚本
     "test": "echo \"Error: no test specified\" && exit 1"
     },
     "keywords": [],
         "author": "",
     "license": "ISC"
     }

调用内置模块
require('http')//与导入自定义模块略有不同,参数内不需要有文件路径
require('url')
require('fs')

自定义模块 B模块调用A模块的sum方法:
A.js:
function sum() {...}
module.exports = {//此对象中的方法可为其他模块导入使用
sum: sum
};

    B.js:
    var a = require('./A');//代码导入A模块,可以使用A模块中module.exports中的方法,'./'为导入的模块的路径,表示当前目录,'A为导入模块的名字'
    a.sum();//调用A模块中的sum函数

NODE中的内置模块

服务器端需要处理的事情
+ 在服务器上创建一个服务(监听一个端口)
+ 接收(解析)客户端的请求信息
+ 找到客户端需要的资源文件中的源代码
+ 把源代码返回给客户端

http.createServer([callback]):创建服务,默认遵循的是http传输协议
[callback]:此处的callback并不是当服务创建成功和=后就执行的,而是要等到客户端项向当前的服务发送请求时才会被触发,而且每次发送请求都会被触发,我们需要在这个回调函数中完成:接收解析、资源查找、源代码返回等操作

    客户端如何迪昂当前服务发送请求?

    http://localhost:8080/
    向本地8080端口对应的服务发送请求

    http://本机的ip地址:8080/
    通过服务器的ip地址(外网ip,局域网ip)向当前服务器的8080服务发送请求

    不仅会触发callback,还默认传递了2个参数:function(req.res){}
    - req:request 请求对象,里面有很多属性和方法,存储了客户端的全部请求信息
        + req.url:储存的是客户端请求的资源文件路径以及问号传参的值,如:/css/index.css?name=zxt&age=27(字符串)
    - res:response 响应对象,里面提供了很多方法,可供服务器把源代码返回给客户端
        + res.write([content]);向客户端响应内容(响应的内容是字符串)
        + res.end(); 结束向客户端的响应
        + res.writeHead;重写响应头

listen([port],[callback]):监听端口
[port]:端口号,取值范围0到65535,需要保持端口号的唯一性
[callback]:服务创建成功后,会执行这个回调函数,一般我们会输出一句话提示开发者创建成功
@return:类型,作用
例如
var http = require('http');
var server = http.createServer();
server.listen(80,function () {
console.log('success');
});

例如:

    var url = require('url');
    var str = "http://www.zhufengpeixun.cn:80/school/login.html?a=12$b=13#c"
    cosnole.log(url.parse(str,true));

    结果:
    Url {
      protocol: 'http:',
      slashes: true,
      auth: null,
      host: 'www.zhufengpeixun.cn:80',
      port: '80',
      hostname: 'www.zhufengpeixun.cn',
      hash: '#c',
      search: '?a=12&b=13',
      query: { a: '12', b: '13' },//第二个参数true会把问号传参解析成对象
      pathname: '/school/login.html',
      path: '/school/login.html?a=12&b=13',
      href: 'http://www.zhufengpeixun.cn:80/school/login.html?a=12&b=13#c' }

静态资源文件请求处理(HTML/CSS/JS/IMG(PNG、JPG、GIF...)/TXT...)

例:

//->导入需要的内置模块
var http = require('http'),
    url = require('url'),
    fs = require('fs');
    
//->创建服务监听端口
var server = http.createServer(function (req, res) {//创建服务
    var urlObj = url.parse(req.url, true),//url解析,true参数表示将问号传参解析为对象
        pathname = urlObj.pathname,//解析后的请求文件路径
        query = urlObj.query;//解析后的问号传参对象
    //->客户端静态资源文件请求的处理
    var reg = /\.([0-9a-zA-Z]+)/i;
    if (reg.test(pathname)) {
        var conFile = null,
            status = 200;
        try {//容错处理,防止请求文件返回错误报错而阻塞代码执行
        conFile = fs.readFileSync('.' + pathname);
        } catch (e) {
            conFile = 'not found~';
            status = 404;
        }
        //->根据当前请求资源文件的后缀名,计算出文件的MIME类型
        var suffix = reg.exec(pathname)[1].toUpperCase(),//后缀名捕获
        suffixMIME = 'text/plain';//文件MIME类型默认为txt的
        switch (suffix) {
            case 'HTML':
                suffixMIME = 'text/html';
                break;
            case 'CSS':
                suffixMIME = 'text/css';
                break;
            case 'JS':
                suffixMIME = 'text/javascript';
                break;
        }
        //->在返回数据内容之前指定MIME类型(重写响应头)
        res.writeHead(status, {
            'content-type': suffixMIME + ';charset=utf-8;'
        });
        res.end(conFile);
    }
    });
    server.listen(8080);//监听端口
上一篇 下一篇

猜你喜欢

热点阅读