前端学习笔记 -- Node.js

一、介绍
1、宿主环境
javascript是由ECMAScript、DOM、BOM三部分组成,浏览器实现了ECMAScript标准,使其能够运行于浏览器,我们称浏览器为ECMAScript的宿主环境。
除了可以运行于浏览器环境外,ECMAScript还可以运行于Adobe Flash环境中(称为Action Script),这时Adobe Flash也是ECMAScript的宿主环境。
Nodejs也是另一种可以运行ECMAScript的宿主环境。

2、安装
https://nodejs.org/zh-cn/ 官网下载后安装 安装完成
node -v 查看版本

二、基础语法

    1、require 用来加载并执行其他脚本文件
         require('./01 hello.js'); 
    2、module 用来到处脚本文件的属性或方法
    3、exports 用来到处脚本文件的属性或方法
    4、_dirname 用来获取当前文件目录  dir 是 directory
     console.log(__dirname);
    5、filename 用来获取当前文件的绝对路径
         console.log(__filename);
    6、global 全局对象,类似于浏览器中的window。
      a) setTimeout/clearTimeout
      b) setInterval/clearInterval
      c) console

三、模块
1、系统模块
在安装Nodejs时一些模块自动被安装,这些模块大多由Nodejs官方维护,称这类模块为系统(核心)模块,如fs、path、os、http等。
模块被加载后才能使用,Nodejs提供了全局的函数require加载模块。

  1. os模块 获取当前操作系统信息 系统信息,内存,cpu

    使用 require 将模块引入 模块名叫 os
    const os = require(‘os’);

    console.log(os.freemem());
    console.log(os.totalmem());
    console.log(os.cpus());

    1. fs模块 文件读写操作

    const fs = require(‘fs’);

    创建文件夹
    mkdir()
    fs.mkdir(‘abc’, (err) => {
    console.log(err);
    });

    删除文件夹
    rmdir
    fs.rmdir(‘./abc’, (err) => {
    console.log(err)
    })

    创建文件
    writeFile
    fs.writeFile(‘./abc/fs.css’, ‘body {width: 100px; color: red;}’, (err) => {
    console.log(err)
    });

    读取文件
    readFile
    fs.readFile(‘./abc/fs.css’, ‘utf-8’, (err, res) => {
    console.log(err);
    console.log(res);
    });

    1. path模块 路径处理

    var path = require(‘path’);
    获得某路径的 上一级
    console.log(path.dirname(‘./fs/hello/abc’));

    extension ext 获得文件扩展名
    console.log(path.extname(‘./fs/hello.css’));

    parse 解析路径

    console.log(path.parse(‘./fs/hello.js’));
    let {name, ext} = path.parse(‘./fs/hello.js’);

    console.log(name, ext);
    console.log(__dirname);

    判断是不是是绝对路径

    console.log(path.isAbsolute(__dirname));
    console.log(path.isAbsolute(‘./fs/hello.js’));

2、文件模块
除了系统模块外,还有以文件形式存在的模块,这些模块由一些组织或个人根据不同的业务需求开发。 注:模块也被称为包。

  1. 用户模块

    1) Nodejs中文件模块分两种,一种是.js结尾,一种是以.json结尾
    
      nodejs “想了一个方法可以使用当前模块下定义的方法或属性可以以返回值的形式开放给其它模块使用”
    可以将当前模块开放(暴露)给另外一个模块
    module.exports = addCart;
    module.exports = {
        addCart: addCart
    }
    
    可以将当前模块开放(暴露)给另外一个模块
    exports.addCart = addCart;
    exports = {
        addCart: addCart
    }
    在Nodejs中真正提供开放功能是 module.exports
    exports 只是 module.exports 的简写
    即 exports = module.exports
    exports.addCart = addCart; 等同于  module.exports.addCart = addCart;
    
    示例:
    function add () {
        console.log(`添加`);
    }
    
    function remove(id) {
        console.log(`删除`);
    }
    // 将上述两个方法开放出去
    1、使用 module.exports
        module.exports = {
            add: add,
            remove: remove,
        }
    
    2、使用 exports
        exports.add = add;
        exports.remove = remove;
        exports.add = function () {
            console.log(`添加`);
        }
        exports.remove= function () {
            console.log(`删除`);
        }
    
    将构造函数实例开发出去
    function Person(name, age) {
        this.name = name;
        this.age = age;
        this.sayHi = function () {
            console.log(this.name, this.age);
        }
    }
    module.exports = new Person('chenli', 24);
    exports = new Person();
    

    2) require加载模块路径
    通过 require 可以加载其它模块 给require传入一个模块的路径

    require('./hello.js');
    可以省略后缀
    require('./hello');
    相对路径: 凡是以 . 或 .. 开头的称为相对路径
    绝对路径: 凡是以盘符(windows)或者 / (Linux)开头的称为绝路径
    
    a. 如果说 传递的参数是 相对路径,则相对于当前文件
        var hello = require('./hello'); // 指的是与当前文件同级下的 hello.js
        var hello = require('../hello'); // 指的是与当前文件上一级下的hello.js
    
    b. 如果传递的是一个绝对路径
        var hello = require('E:\\nodejs\\hello');
    
    c. 直接写模块名,则去找当前目录下有没有一个 node_modules
        如果有则查看此目录下有没有 一个 hello.js
        如果有则加载
        如果当前下没有 node_modules,则会查找上一级有没有 node_modules
        如果有则相看此目录有没有 hello.js,有则加载
        一直向上级找下去
        var hello = require('hello');
    
    3) 多文件模块(也叫包)指某一个功能模块的集合,通常由多个文件构成,
        统一到某一目录集中管理,并且使用package.json记录包的相关信息, 
        例如模块名称、版本号、作者等,可使用npm init根据提示创建。
        var hello = require('./hello');
        先找 xxx.js 文件
        如果没有 xxx.js 则查找 xxx/package.json
        查找 package.json 中的 main 属性
        当引入多文件形式的(模块)包时,main属性指定默认加载文件
        如果 xxx/package.json 也没有则查找 xxx/index.js
    
  2. 第三方模块
    npm (Node Package Manager) 这个工具随Nodejs一起被安装,可以使用 npm -v 检测是否安装
    使用npm可以安装、卸载、发布模块。

    1、安装
    a) 本地安装,安将到当前目录下node_modules中
    npm install 模块名称
    b) 全局安装,安装到默认c盘
    npm install 模块名称 -g
    2、卸载
    a) 本地卸载
    npm uninstall 模块名称
    b) 全局卸载
    npm uninstall 模块名称 -g
    3、发布模块
    a) 注册用户,注册npm账号
    b) 编写模块
    新建hello.js,编写简单逻辑。
    c) 发布模块
    在模块目录执行 npm login,根据提示输入用户名、密码、邮箱进行登录,然后执行npm publish完成发布。

3、获取文件类型 mime

    使用mime可以获取文件类型
    const mime = require('mime');
    let css = './public/css/main.css';
    let img = './public/images/logo.png';
    let js = './public/js/jquery.min.js';
    let json = './public/data/users.json';
    console.log(mime.lookup(js));
    console.log(mime.lookup(json));

四、http服务
1、搭建服务器

// 在 nodejs 中使用 系统模块 http 来创建 http 服务器
    const http = require('http');

//createServer 方法用来创建服务器实例
var server = http.createServer();

// 监听端口 0 ~ 65535
server.listen(3000);

// 通过一个事件 request 来监听网络请求
// 使用 on 来监听http请求 
server.on('request', (request, response) => {
    // response 处理响应
    // request  处理请求

    // console.log(request);
    // console.log(response);

    // 通过上述的打印结果得之request 和 response 都是一个对象

    // 在对象下有属性和方法来处理 请求和响应
    // 请求结果
    console.log(request.method);
    console.log(request.url);
    console.log(request.headers);

    // 响应内容
    response.write('hello nodejs');

    //结束响应
    response.end();
})

访问浏览器 http://localhost:3000

2、处理响应
通过res对象处理响应,如状态码,响应头,响应主体等。

3、处理请求
使用req对象处理请求,如请求方式、请求头、查询参数、请求主体等。
get 查询参数,查询字符串做为地址的一部分,需要使用url系统模块解析得到
post参数做为请求主体传递

4、静态网站
我们通过浏览器所能看到的网页内容实质上是服务器返回的html字符串,浏览器进行渲染输出
浏览器解析html标签过程中,遇到img、script、link、iframe等标答时会再次向服务器发起请求,服务器也需要做出响应。

5、动态网站
所谓动态网站是指网页内容由程序动态生成,通常是将数据库中的数据取出,然后拼接成html字符串,响应给浏览器进行解析。

1.路由是指URL地址与程序的映射关系,更改URL地址可以改变程序的执行结果。
2.模板引擎
从数据库中取出数据后需要拼接成html字符串再响应给浏览器,
这个任务通常由模板引擎完成,模版引擎的种类非常多, 
比如artTemplate、swig、xtpl等。

6、路径

目录不等路径
根+目录+分隔符+文件名 格式
E:\asdf\sadf\aa.txt 文件系统的
http://localhost/dsaf/ads/index.html 网络系统的

在文件系统中目录和文件都是真实存在的,路径与目录和文件的关系是一一对应的,以目录角度确定路径不出有问题。
但是网络中目录和文件不一定真实存在,路径与目录和文件不一定是一一对应的关系,以目录角度确定路径就会出问题。

五、Express框架

1、安装
Express 使用 npm install express进行本地安装。

2、使用

// 引入express
const express = require('express');
// 路径
const path = require('path');
// http服务器实例
const app = express();
// 监听3000端口
app.listen(3000);

// 模板引擎 exrpess 没有自带 使用的单独模板引擎
// 使用 xtpl 需要同时安装 xtemplate 和 xtpl
// 设置模板引擎
app.set('view engine', 'xtpl');
// 设置默认模板目录
app.set('views', path.join(__dirname, './views'));

// 设置静态资源目录(图片、css、js)
app.use(express.static(path.join(__dirname, './public')));


// 以get方式请求 '/'路由
app.get('/', (req, res) => {
    // send方法响应普通字符串
    res.send('<h1>响应字符串</h1>');
    // render方法处理模板
    // 在views 目录中加载index.xtpl模板
    res.render('index', {'titele': '学习拉'});
})
// 以post方式请求 '/save'路由
app.post('/save', (req,res) => {
    // req请求res响应
    // 响应浏览器json格式的数据
    res.json({name: 'zhangsan', age: 18});
});

3、模板xtpl
a)使用”{{}}”和 “{{{}}}”输出变量

 变量title将被解析,如果title值包含HTML标签 将不会被转义
 <h2>{{title}}</h2>

b)流程控制 {{# 关键字}} 和{{/关键字}}

遍历数据,根据条件过滤数据
{{#each (users)}}
    <tr>
        <td>{{this.name}}</td>
        {{#if (this.gender === 0)}}
        <td>男</td>
        {{else}}
        <td>女</td>
        {{/if}}
        <td>{{this.age}}</td>
        <td>{{this.phone}}</td>
        <td>{{this.email}}</td>
        <td>{{this.subject}}</td>
        <td>{{this.score}}</td>
        <td>{{this.start_date}}</td>
        <td>{{this.end_date}}</td>
        <td>
            <a href="javascript:;">编辑</a>
            <a href="javascript:;">删除</a>
        </td>
    </tr>
    {{/each}}

六、数据库软件

 mysql 默认端口3306
如果是wampServer 安装 mysql 
打开wamp-->bin-->mysql-->bin--> 复制路径
我的电脑右键属性-->高级系统设置 -->环境变量 -->双击path 末尾加;添加 复制的路径 确定 即可
随意地方打开命令面板 输入 mysql -u root -p
-h 表示MySQL服务器地址
-u 表示用户名称 默认 root
-p 表单用户密码 默认 空

可视化工具
CMD做为客户端可以访问MySQL服务器,但工作效率非常低,实际开发中一般使用可视化的工具管理数据库。
可视工具种类非常多,推荐使用Navicat for MySQL,它是一个付费软件。

1、登录
登录界面操作

2、创建数据库
CREATE DATABASE 数据库名称

3、创建数据表
图形界面创建

4、插入数据
INSERT INTO 表名 (字段1, 字段2, 字段3…) VALUES(值1, 值2, 值3…);
例如INSERT INTO users (id, name, age, pass) VALUES(4, ‘admin’, 18, ‘8213121’);

5、查询数据
SELECT 字段名1,字段2,字段名3… FROM 表名;
例如SELECT name, sex, email, pass FROM users;

6、更新数据
UPDATE 表名 set 字段名1=’值1’, 字段名2=’值2’, ….
例如 update users set pass=’abcdefg’, name=’xiaohong’, age=20

7、删除数据
DELETE FROM 表名 WHERE 条件
例如delete from users where age=20

8、筛选数据
带条件的查询
SELECT 字段名1, 字段名2, 字段名3.. WHERE 条件 AND 条年 OR 条件
例如select id, name, age from users where age<18 and sex=’boy’ or age>18 and sex=’girl’

9、排序数据
查找数据并将数据排序
SELECT 字段名1, 字段名2.. FROM 表名 ORDER BY 排序条件 顺序
ASC 正序 DESC 倒序
例如select id, name, age from users order by age desc

10、分组数据
查找数据并分组进行统计操作
SELECT 统计操作 FROM 表名 GROUP BY 条件
count统计 sum求合 avg 平均值
select avg(age) as total from users group by sex 分组求平均年龄
select sum(age) as total from users group by sex 分组求年龄和
select count(*) as total from users group by sex 计算分组合每组个数

11、导出导入数据
数据库是个做迁移操作的,其中包含了导入和导出操作。

12、数据类型
每个字段对应的列的数据是要有特定类型的,比如 数值、字符、时间等。

13、主键
表中每一行都应该有可以唯一标识自己的一个字段,此字段称为主键(PRIMARY KEY),此字段值不允许重复,一般设为自增长(AUTO_INCREMENT)
实例

const express = require('express');
const mysql = require('mysql');
const app = express();

app.listen(3000);
// 通过 mysql 模块来操作 MySQL数据库
const db = mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: '',
    database: 'mytest'
});
// 使用返回值 db 就可以通过 SQL 语句来操作数据库
// 使用 db.query(); 可以直接执行mysql 语句

// 查询
db.query('select * from users', (err, data) => {
    if(err) return;
    console.log(data);
});

// 添加
db.query('insert into users values(3, "xiaoming", 1)', (err, data) => {
    if(err) return;
    console.log(data);
});

app.get('/', (req, res) => {
    res.send('学习MySQL');
});

  实例     
const express = require('express');
const path = require('path');
const bodyParser = require('body-parser');
const db = require('./model/db');
const app = express();

app.listen(3000);
// 设置模板
app.set('view engine', 'xtpl');
// 引入模板路径
app.set('views', path.join(__dirname,'./views'));
// 引入静态文件
app.use(express.static(path.join(__dirname,'./public')));
// 引入中间件
app.use(bodyParser());

app.get('/', (req, res) => {
    res.render('add', {});
});

app.get('/list', (req, res) => {
   let query = 'select * from users';
    // 查询用户
    db.query(query, (err, data) => {
        if(err) return;
        // 渲染模板
        res.render('list', {users: data});
    });
});

app.post('/add', (req, res) => {
    let query = 'insert into users set ?';
   db.query(query, req.body, (err, data) => {
        if(err) return;

        res.json({
            code: '200',
            msk: 'OK'
        });
   });

});

7、Promise
AMD和CMD适用于浏览器端,CommonJS 适用于 Nodejs 即 后端
如果开发者遵循了 AMD 的规范来定义模块

 define([''], function (){
          return {

       }
  });
模块加载器来加载模块(其中requirejs 可以加载AMD规范)

 也可以使用CMD规范来定义模块
 define(function (require, exports, module) {
     require(); //可以加载其他模块
       使用exprots 和 module 将这些模块开放出去
       exports.hello = function (){
                 //向外开入了hello方法
        }
       module.exports = {
               hello : hello 
        }
 });

猜你喜欢

转载自blog.csdn.net/weixin_38457248/article/details/81807046