Nodejs

了解Nodejs

Nodejs是2009由Ryan Dahl推出的运行在服务端的 JavaScript(类似于java,php,python,.net等服务端语言), 基于Google的V8引擎,V8引擎执行Javascript的速度非常快,性能非常好。

版本

在命令窗口中输入 node -v 可以查看版本

安装与配置

  1. 下载安装文件
  2. 下载完后进行安装,建议安装到默认路径(注意不要有中文路径)
  3. 配置环境变量(安装时勾选)
  4. 在命令窗口中输入 node -v,如果正常显示版本号则表示安装成功

Nodejs的使用

REPL(Read Eval Print Loop 交互式解释器)

类似于在浏览器的开发人员工具的控制台,一般用于在服务端执行一些简单的javascript语句

REPL

执行js文件代码

REPL 只适用于一些简单的 Javascript 语法,对于稍复杂的程序,可以直接写到 js 文件当中,并执行以下命令

    node hello.js

不同于前端js代码,没有浏览器安全级别的限制,提供很多系统级别的API,如: - 文件的读写 - 进程的管理 - 网络通信 - ……

NPM(Node Package Manager包管理)

Node.js 的包管理器 npm,是全球最大的开源库生态系统,随着nodejs一起安装(npm -v查看安装版本)

模块化开发

为了让Nodejs的文件可以相互调用,Nodejs提供了一个简单的模块系统,一个文件即一个模块,采用同步的commonJS规范

模块分类

模块系统是 Nodejs 最基本也是最常用的。一般情况模块可分为四类:

创建自定义模块

//hello.js

function hello(){
    return 'hello laoxie';
}

//对外暴露接口
module.exports = hello;

导出模块

如果没有这句话,引入模块时 就会得到 undefined。

    //person.js
    function setName(){
        return 'laoxie'
    }

    function setAge(){
        return 18
    }

    // 对外博陆接口
    exports.setName = setName;
    exports.setAge = setAge;

引入模块require()

引入模块,使用nodejs内置的require()方法

    //page.js

    //得到一个对象,包含暴露的setName,setAge方法
    let person = require('./person.js');

    // 既然是得到对象,也可以直接解构
    let {setName,setAge} = require('./person.js');

require

原生模块

原生模块不需要安装,直接引入使用

路由

在 BS 架构中,路由的概念都是一样的,可理解为根据客户端请求的 URL 映射到不同的方法实现,更多的一般都是针对 URL 中的路径,或者是参数,又或者是锚点这些信息进行映射。

应用场景

    const http = require('http')
    const url = require('url')
    const qs = require('querystring');
    const util = require('util');

    http.createServer((request, response) => {
        // 处理url地址
        let urlObj = url.parse(request.url, true);

        // 获取访问路径
        let pathname = urlObj.pathname;

        // 获取请求类型
        let method = request.method.toUpperCase();

        // 获取参数
        let params = urlObj.query;

        // POST请求处理方式
        if(method == 'POST'){
            let postData = '';
            request.on('data', (_data) => {
                postData += _data;
            })
            request.on('end', () => {
                postData = qs.parse(postData);
                let result = {};
                switch(pathname){
                    case '/login':
                        //连接数据库,实现登陆逻辑
                        result = {status: true};
                        break;
                    case '/register':
                        //连接数据库,实现注册逻辑
                        result = {status: true};
                        break;
                    default :
                        result = {status: false, message: '没有对应的请求'};
                        break;                  
                }
                response.end(util.inspect(result))
            })
        } 

        // get请求处理方式
        else if(method === 'GET'){
            let result = {};
            switch(pathname){
                case '/students':
                    //连接数据库,获取学生信息
                    result = {status: true, data: [], params};
                    break;
                case '/orders':
                    //连接数据库,获取订单信息
                    result = {status: true, data: [], params};
                    break;
                default :
                    result = {status: false, message: '没有对应的请求', params};
                    break;
            }
            response.end(util.inspect(result))
        }
    }).listen(88);

【案例】

【练习】