Giter Club home page Giter Club logo

nodejs's Introduction

nodejs

目录说明

  • 包教不包会系列: nodejs
  • koa 源码: 1000 行的源码阅读和实现
  • koa study: koa 的使用学习
  • koa: 自己的一个小 demo
  • 爬虫: nodejs 的使用
  • node-study: 个人博客系统
  • node-mysql: node 连接 mysql 数据库增删改查
  • bilibili 100 多集的视频课
  • node 实战

nodejs 实战

一些工具

1.commander.js:获取命令行参数

  1. live-server: 启动一个本地具有热更新的服务

2.colors:让console具有颜色

链接

node in action node 入门

nodejs's People

Contributors

homobulla avatar

Watchers

 avatar

nodejs's Issues

增删改查

关系数据库的基本操作就是增删改查,即CRUD:Create、Retrieve、Update、Delete。其中,对于查询,我们已经详细讲述了SELECT语句的详细用法。

注意结尾的分号以及字符串字段的''

而对于增、删、改,对应的SQL语句分别是:

  • INSERT:插入新记录;
  • UPDATE:更新已有记录;
  • DELETE:删除已有记录。

INSERT

基本语法:

INSERT INTO <表名> (字段1,字段2...) VALUES (值1,值2...)

添加多条则在VALUES后追加多条数据。

UPADTE

基本语法:

UPDATE <表名> SET 字段1=1,字段2=2...WHERE...

UPDATE也可以使用表达式:

UPDATE students SET score=score+10 WHERE score<80

其表现和DELETE基本相同

DELETE

基本语法:

DELETE FROM <表名> WHERE ...;

DELETE/UPDATE数据的重点在于WHERE的筛选,当WHERE没有筛选出符合条件的记录时不会报错,也不会DELETE/UPDATE任何数据。如果没有WHERE关键字,则会DELETE/UPDATE所有记录。同时在mysql中,DELETE/UPDATE语句会返回更新的行数以及WHERE条件匹配的行数。

其他一些命令行语句:

ALTER TABLE <> CHANGE <字段> VARCHAR(36) CHARACTER SET utf8 NOT NULL;  // 修改某个字段编码格式,中文
CREATE DATABASE database-name // 创建数据库
CREAT TABLE tablename  // 创建表
REPLACE INTO students (id, class_id, name, gender, score) VALUES (1, 1, '小明', 'F', 99);   // 替换原先id=1的数据
CREATE TABLE students_of_class1 SELECT * FROM students WHERE class_id=1;  // 快照,即复制一份表

针对某个表增加某列

ALTER TABLE students ADD COLUMN birth VARCHAR(10) NOT NULL;

修改某列

ALTER TABLE students CHANGE COLUMN birth birthday VARCHAR(20) NOT NULL;
# 修改列名并改变格式

删除某列

ALTER TABLE students DROP COLUMN birthday

数据库SQL基础

关系模型:表中的每一行数据被称为一条记录,一条记录由多个字段组成。

  • 一对多
  • 多对一
  • 多对多 (通过中间表,关联两个一对多的表)
  • 一对一

CMD进入数据库

 mysql -hlocalhost -uroot -proot

其中**-h表示服务器名,localhost表示本地;-u为数据库用户名,root是mysql默认用户名;-p为密码,如果设置了密码,可直接在-p**后链接输入,如:-p123456

主键

关系表中不能存在两条完全相同的记录,必须要能通过某个字段(即主键)提取出唯一的记录。

主键具有唯一性,且(最好)不可变,主键也不应该允许NULL。同时主键的字段选择不能与业务有任何的关联,一般会自增整数类型(即id)来作为主键。

外键

外键是把数据与另一张表关联起来的列。

外键通过定义外键约束实现:

ALTERTSBLE students // 找到对应表
ADD CONSTRAINT fk_class_id // 添加约束,fk_class_id 约束名称任意,
FOREIGN KEY (class_id) // 指定class_id为外键	
REFERENCES classes (id)  // 将外键关联到classes 表的id列

引入外键的意义在于关系数据库可以保证无法插入无效的数据,但会降低数据库的性能

删除外键:

ALTERTABLE students
DROPFOREIGNKEY fk_class_id

索引

索引是关系数据库中对某一列或多个列的值进行预排序的数据结构,通过索引,可以让数据系统不必扫描整个表,而是直接定位到符合条件的记录。

id class_id name gender score
1 1 小明 M 90
2 1 小红 F 67
3 1 小兰 M 89

索引的效率取决于索引值是否散列,即该列的值如果越不相同效率越高,从这个角度来说,gender列毫无意义,score是相对合适的,我们以score来创建索引:

ALTER TABLE students
ADD INDEX idx_score (score) // 创建了名称为idx_score,使用score列的索引,索引可以有多列,即多个搜索关键字,倘若二人分数一致,第二个索引会加以区分。

一张表可以创建多个索引,但索引会导致插入、更新、删除记录时速度变慢,因为其需要同时修改索引值。

对于主键,关系数据库会自动对其创建主键索引。使用主键索引的效率是最高的,因为主键会保证绝对唯一。

唯一索引可以对某列形成约束,使某列的值具有唯一性:

ALTER TABLE students
ADD UNIQUE uni_name (name)

也可以只对某一列添加一个唯一约束而不创建唯一索引:

ALTER TABLE students
ADD CONSTRAINT uni_name UNIQUE (name)

注意结尾的分号以及字符串字段的''

数据查询

基本查询

SELECT * FROM <表名> 

条件查询

通过WHERE来添加筛选条件

SELECT * FROM student WHERE score >=80
SELECT * FROM <表名> WHERE <条件表达式>
SELECT * FROM students WHERE score>= 80 AND gender = "M"
SELECT * FROM students WHERE score>= 80 OR gender = "M"
SELECT * FROM students WHERE score>= 80 AND NOT gender = "M"
SELECT * FROM students WHERE score BETWEEN 60 AND 90

投影查询

条件查询的结果都是和表结构一致的,使用投影查询可以自定义返回所需要的列:

SELECT id,score FROM student
SELECT1, 列2, 列3 FROM ...
SELECT1 别名1, 列2 别名2, 列3 别名3 FROM ...  // 取别名

排序查询

通过关键字ORDER BY来正序,通过追加DESC来倒序:

SELECT id,name changeName,score FROM students ORDER BY score
SELECT id,name,score FROM students ORDER BY score DESC 

分页查询

分页是将结果集中“截取”出第M~N条记录,其通过LIMIT <M> OFFSET <N>实现:

SELECT id,name,score FROM students ORDER BY score DESC LIMIT 3 OFFSET 0;

我们每pageSize为3,上述代码为第一页。LIMITOFFSET的计算:

LIMIT:pageSize
OFFSET: pageSize * (pageIndex - 1)

获得总页数:

SELECT CEILNG(COUNT(*)/3) FROM students;

聚合查询

SQL提供了一些内置的计算方法,比如某个表共有多少条记录:

SELECT COUNT(*) FROM students;
SELECT COUNT(*) boys FROM students WHERE gender = 'M';

返回的查询结果依旧还是个二维表,虽然其只有一行一列,且列名为COUNT(*)、boys.

除了COUNT(),还内置了SUM AVG MAX MIN

SELECT SUM(score) boys FROM students WHERE gender = 'M'

如果聚合查询的WHERE条件没有匹配到任何行,COUNT()会返回0,而SUM()AVG()MAX()MIN()会返回NULL;

分组

SELECT COUNT(*) num FROM students WHERE class_id = 1

上述语句可以得出一般总人数,如果想同时获取每个班的人数:

SELECT class_id,COUNT(*) num FROM students GROUP BY class_id

也可以使用多个列进行分组:

SELECT class_id,gender,COUNT(*) num FROM students GROUP BY class_id,gender

多表查询

SQL可以从多张表同时查询数据,语法为SELECT * FROM <biao1> <biao2>

多表查询的记录是两个表列和字段量互乘的结果;

SELECT
    s.id sid,
    s.name,
    s.gender,
    s.score,
    c.id cid,
    c.name cname
FROM students s, classes c
WHERE s.gender = 'M' AND c.id = 1;

连接查询

多表查询时对多个表进行JOIN运算,即先确定一个主表作为结果集,首先是内连接:

语法:SELECT <字段> ... FROM <主表> INNER JOIN <关联表> ON <关联关系,即某个字段相同>

SELECT s.id,s.name,s.class_id,c.name class_name,s.gender,s.score FROM students s INNER JOIN classes c ON s.class_id = c.id

与之对应的是外连接:

SELECT s.id,s.name,s.class_id,c.name class_name,s.gender,s.score FROM students s RIGHT OUTER JOIN classes c ON s.class_id = c.id

其中的RIGHT关键字类似于集合的概念,即关联表全部;如果是LEFT OUTER JOIN则结果是主表的全部数据;INNER JOIN是二者交集,FULL OUTER JOIN是二者全部数据。

node模块

node 模块分类

Node.js 的模块分为两类:

  • 核心模块(node 提供)
  • 文件模块(用户编写)

核心模块在 Node.js 源代码编译的时候编译进了二进制执行文件,在 nodejs 启动过
程中,部分核心模块直接加载进了内存中,所以这部分模块引入时可以省略文件定位和编
译执行两个步骤,所以加载的速度最快。另一类文件模块是动态加载的,加载速度比核心
模块慢。但是 Node.js 对核心模块和文件模块都进行了缓存,于是在第二次
require时,是不会有重复开销的。其中原生模块都被定义在 lib 这个目录下面,文
件模块则不定性。

通过 process.moduleLoadList 可以查看已经加载的核心模块。 核心模块 = 原生模块

模块引入三步

  1. 路径分析
  2. 文件定位
  3. 编译执行

路径定位

核心模块:如 http、fs、path 等,速度仅次于缓存。路径形式的文件:以.或者..开始的
相对路径,以/开始的绝对路径。自定义模块:不属于核心模块也不属于路径形式的标识符
。它是一种特殊的文件模块,可能是一个文件或者包的形式。这类模块的查找是最费时的,
也是所有方式中最慢的一种。在定位时,会给出一个可能路径的数组。

路径分析代码追踪栈

Module.prototype.require --> Module._load --> Module._resolveFilename --> Module._resolveLookupPaths --> Module._findPath(文件定位) --> fileName(文件绝对路径)

几个方法的作用小结: Module.prototype.require:直接调用 Module._load 并
return Module._load:调用 Module._resolveFilename 获取文件绝对路径,并且根
据该绝对路径添加缓存以及编译模块 Module._resolveFilename:获取文件绝对路径
Module._resolveLookupPaths:获取文件可能路径 Module._findPath:根据文
件可能路径定位文件绝对路径,包括后缀补全(.js, .json, .node)等都在此方法中执行
,最终返回文件绝对路径

node连接数据库

node如何连接数据库

通过以下代码连接了我本地的数据库

let mysql = require("mysql");
let connection = mysql.createConnection({
    host: "localhost",
    user: "root",
    password: "***",
    database: "cainiao"
});

connection.connect();

调用mysql模块的createConnection来做数据库配置,其中host为主机地址(默认localhost),user为用户名,password为密码,database则是连接的数据库名称,更多的参数说明与配置,在mysql查阅。

连接成功之后就是对数据进行增删改查。

function selectDate(search) {
    // 数据库的查询是一个异步读取的过程,用promise包裹,search是查询条件
    return new Promise((resolve, reject) => {
        let sql = search != "undefined" ? `SELECT * FROM websites WHERE ${search}` : `SELECT * FROM websites`;
        connection.query(sql, function(err, result) {
            if (err) {
                reject(err.message);
                return;
            }
            resolve(result);
        });
    });
}

// 增加数据
function insertSql(pres = []) {
    return new Promise(async (resolve, reject) => {
        // 先判断是否存在
        const result = await selectDate(`name='${pres.name}'`).then(res => {
            return res;
        });
        if (result.length != 0) {
            reject({
                success: false,
                err: `新增失败,已存在name为${pres.name}的数据。`
            });
            return;
        }
        var addsql = `INSERT INTO websites (Id,name,url,alexa,country) VALUES (0,?,?,?,?)`;
        connection.query(addsql, [pres.name, pres.url, pres.alexa, pres.country], function(err, ret) {
            if (err) {
                reject(err.message);
            }
            resolve(ret);
        });
    });
}

新增数据接口为post请求,要获取其参数需要做一步操作:

const querystring = require("querystring");
// 针对post传参的解析
const paramBody = req => {
    return new Promise((resolve, reject) => {
        /**服务端接收post请求参数的流程
         * (1)给req请求注册接收数据data事件(该方法会执行多次,需要我们手动累加二进制数据)
         *      * 如果表单数据量越多,则发送的次数越多,如果比较少,可能一次就发过来了
         *      * 所以接收表单数据的时候,需要通过监听 req 对象的 data 事件来取数据
         *      * 也就是说,每当收到一段表单提交过来的数据,req 的 data 事件就会被触发一次,同时通过回调函数可以拿到该 段 的数据
         * (2)给req请求注册完成接收数据end事件(所有数据接收完成会执行一次该方法)
         */
        //创建空字符叠加数据片段
        var data = "";

        //2.注册data事件接收数据(每当收到一段表单提交的数据,该方法会执行一次)
        req.on("data", function(chunk) {
            // chunk 默认是一个二进制数据,和 data 拼接会自动 toString
            data += chunk;
        });

        // 3.当接收表单提交的数据完毕之后,就可以进一步处理了
        //注册end事件,所有数据接收完成会执行一次该方法
        req.on("end", function() {
            //(1).对url进行解码(url会对中文进行编码)
            data = decodeURI(data);
            /**post请求参数不能使用url模块解析,因为他不是一个url,而是一个请求体对象 */
            //(2).使用querystring对url进行反序列化(解析url将&和=拆分成键值对),得到一个对象
            //querystring是nodejs内置的一个专用于处理url的模块,API只有四个,详情见nodejs官方文档
            resolve(querystring.parse(data));
        });
        req.on("err", function() {
            reject(err);
        });
    });
};

module.exports = {
    paramBody
};

而在SQL语句中,在增加数据时将字段值以数组形式传入比较蛋疼,需要后面的学习中能换中写法。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.