Node.js 与前端开发实战 (下篇)| 青训营笔记

132 阅读5分钟

这是我参与「第五届青训营」伴学笔记创作活动的第 8 天

续接上篇

Node.js内置模块:path路径模块

path 路径模块

Node.js 通过path这个内置模块,提供了一些路径操作的API,具体可以参考官方的api文档。这里列举一些常用的API。

path.extname() 获取文件/路径的扩展名

语法格式:

 path.extname(myPath);

代码解释:

  • 获取 myPath 这个文件或者路径的扩展名。
  • myPath 这个参数要求是字符串。如果 myPath 不是字符串,则抛出 TypeError。

代码举例:

const path = require('path');

path.extname('hello.txt'); // 返回 '.txt'

path.extname('www.baidu.com'); // 返回 '.com'

path.extname('index.coffee.md');  // 返回 '.md'

path.extname('index.');  // 返回 '.'

path.extname('index');  // 返回 ''

path.extname('.index');  // 返回 ''

path.extname('.index.md');  // 返回 '.md'

path.resolve() 生成完成的绝对路径

语法格式:

path.resolve([...myPaths])

解释:

  • 将路径或路径片段的序列解析为绝对路径。
  • 返回的路径是从右往左处理,后面的每个 myPath 被依次解析,直到构造出一个完整的绝对路径。

代码举例:

const path = require('path');

let arr1 = ['/foo1/foo2', 'henry', 'foo3'];
let result1 = path.resolve(...arr1);
console.log(result1); // 打印结果:/foo1/foo2/henry/foo3

let arr2 = ['/foo1/foo2', '/henry', 'foo3'];
let result2 = path.resolve(...arr2);
console.log(result2); // 打印结果:/henry/foo3

几个常见路径

  • __dirname:这是一个常量,表示:当前执行文件所在完整目录
  • __filename:这是一个常量。表示:当前执行文件的完整目录 + 文件名
  • process.cwd:获取当前执行 Node命令 时的目录名。

代码举例:

console.log(__dirname);

console.log(__filename);

console.log(process.cwd());

运行结果:

$ node app.js

/Users/smyhvae/henry
/Users/smyhvae/henry/app.js
/Users/smyhvae/henry

path.join() 将多个路径进行拼接

如果是我们手动拼接路径,容易出错。这个时候,可以利用 path.join() 方法将路径进行拼接。

语法格式:

path.join([...paths]);

解释:使用平台特定的分隔符作为定界符将所有给定的 path 片段连接在一起,然后规范化生成的路径。

代码举例:

const path = require('path');

const result1 = path.join(__dirname, './app.js');
console.log(result1); // 返回:/Users/smyhvae/henry/app.js

const result2 = path.join('/foo1', 'foo2', './foo3');
console.log(result2); // 返回:/foo1/foo2/foo3

const result3 = path.join('/foo1', 'foo2', '/foo3');
console.log(result3); // 返回:/foo1/foo2/foo3

OS 系统模块

  • os.networkInterfaces() 查看网络地址

Node.js操作MySQL数据库

Node.js 连接 MySQL

(1)安装 mysql 包:

$ npm install mysql

(2)引入 mysql 包:

const mysql = require("mysql");

(3)建立连接:

let mysql = require("mysql");
let options = {
  host: "localhost",
  //port:"3306", //可选,默认3306
  user: "root",
  password: 'xxx', // 这里改成你自己的数据库连接密码
  database: "henry_database",
};
//创建与数据库进行连接的连接对象
let connection = mysql.createConnection(options);

//建立连接
connection.connect((err) => {
  if (err) {
      // 数据库连接失败
    console.log(err);
  } else {
      // 数据库连接成功
    console.log("数据库连接成功");
  }
});

正常来说,运行程序后,应该会提示数据库连接成功

如果在运行时提示错误Client does not support authentication protocol requested by server,解决办法如下:(在终端进入 sql 之后,输入如下命令)

# 注意,这里的 'root' 请填你的user账号, 'localhost' 请填 你的 host, 'password' 请填你的密码
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

# 然后执行如下命令
flush privileges;

Node.js 增删改查 MySQL

通过 Node.js可以对其进行一些增删改查操作。代码举例如下。

1、查询表

let mysql = require('mysql');
let options = {
    host: 'localhost',
    //port:"3306",//可选,默认3306
    user: 'root',
    password: 'xxx', // 这里改成你自己的数据库密码
    database: 'henry_database'
}
//创建与数据库进行连接的连接对象
let connection = mysql.createConnection(options);

//建立连接
connection.connect((err) => {
    if (err) {
        // 数据库连接失败
        console.log(err)
    } else {
        // 数据库连接成功
        console.log('数据库连接成功')
    }
});


// 1、查询表
let strSql1 = 'select * from henry_student_table';
connection.query(strSql1, (err, result, fields) => {
    if (err) {
        // 表查询失败
        console.log(err);
    } else {
        // 表查询成功
        console.log('henry_student_table 表查询结果:' + JSON.stringify(result));
        console.log('fields:' + JSON.stringify(fields));
    }
})

打印结果如下:

henry_student_table 表查询结果:
[{"id":1,"name":"henry","age":28},{"id":2,"name":"张三","age":34},{"id":3,"name":"李四","age":28}]

fields:[
    {"catalog":"def","db":"henry_database","table":"henry_student_table","orgTable":"henry_student_table","name":"id","orgName":"id","charsetNr":63,"length":11,"type":3,"flags":0,"decimals":0,"zeroFill":false,"protocol41":true},
    {"catalog":"def","db":"henry_database","table":"henry_student_table","orgTable":"henry_student_table","name":"name","orgName":"name","charsetNr":33,"length":765,"type":253,"flags":0,"decimals":0,"zeroFill":false,"protocol41":true},
    {"catalog":"def","db":"henry_database","table":"henry_student_table","orgTable":"henry_student_table","name":"age","orgName":"age","charsetNr":63,"length":11,"type":3,"flags":0,"decimals":0,"zeroFill":false,"protocol41":true}
]

删除表

// 2、删除表
let strSql2 = 'drop table test2_table';
connection.query(strSql2, (err, result) => {
    if (err) {
        // 表删除失败
        console.log(err);
    } else {
        // 表删除成功
        console.log('表删除成功:' + result);
    }
});

打印结果:

表删除成功:
OkPacket {
    fieldCount: 0,
    affectedRows: 0,
    insertId: 0,
    serverStatus: 2,
    warningCount: 0,
    message: '',
    protocol41: true,
    changedRows: 0
}

删除数据库

将上方的sql语句换一下即可:

let strSql3 = 'drop database henry_database';

2、新建数据库

let mysql = require('mysql');
let options = {
    host: 'localhost',
    //port:"3306",//可选,默认3306
    user: 'root',
    password: 'smyhvae001',
    // database: 'henry_database'  // 注意,因为代码里是创建新的数据库,所以这里不需要填其他的数据库名
}
//创建与数据库进行连接的连接对象
let connection = mysql.createConnection(options);

//建立连接
connection.connect((err) => {
    if (err) {
        // 数据库连接失败
        console.log(err);
    } else {
        // 数据库连接成功
        console.log('数据库连接成功')
    }
});

// 创建新的数据库
const strSql4 = 'create database henry_database3';
connection.query(strSql4, (err, result) => {
    if (err) {
        console.log(err);
    } else {
        console.log('新建数据库成功:' + JSON.stringify(result));
    }

});

打印结果:

数据库连接成功
新建数据库成功:{
    "fieldCount":0,"affectedRows":1,"insertId":0,"serverStatus":2,"warningCount":0,"message":"","protocol41":true,"changedRows":0
}

3、新建表

新建表的sql语句举例:

CREATE TABLE `henry_table5` (
    `id` int NOT NULL AUTO_INCREMENT,
    `name` varchar(255) DEFAULT NULL,
    `age` int DEFAULT NULL,
    PRIMARY KEY (`id`)
);

如果是在 js 代码中执行上面这样命令的话,要记得把 sql 语句存放在字符串里的同一行。

代码举例如下:

let mysql = require('mysql');
let options = {
    host: 'localhost',
    //port:"3306",//可选,默认3306
    user: 'root',
    password: 'smyhvae001',
    database: 'henry_database'
}
//创建与数据库进行连接的连接对象
let connection = mysql.createConnection(options);

//建立连接
connection.connect((err) => {
    if (err) {
        // 数据库连接失败
        console.log(err);
    } else {
        // 数据库连接成功
        console.log('数据库连接成功')
    }
});


// 新建表
// 注意,在 js 代码中,sql 语句要存放在字符串里的同一行。
const strSql5 = 'CREATE TABLE `henry_table5` (`id` int NOT NULL AUTO_INCREMENT,`name` varchar(255) DEFAULT NULL,`age` int DEFAULT NULL,PRIMARY KEY (`id`));';

connection.query(strSql5, (err, result) => {
    if (err) {
        // 新建表失败
        console.log(err);
    } else {
        // 新建表成功
        console.log('qianguyihao 新建表成功:' + JSON.stringify(result));
    }
})

打印结果:

数据库连接成功
henry 新建表成功:
{
    "fieldCount":0,"affectedRows":0,"insertId":0,"serverStatus":2,"warningCount":0,"message":"","protocol41":true,"changedRows":0
}

在指定的表中插入数据

在指定的表中插入数据:

// 在指定的表中插入数据
const strSql6 = "insert into henry_table5 (name, age) values ('HenryChen', '28')";

connection.query(strSql6, (err, result) => {
    if (err) {
        // 插入数据失败
        console.log(err);
    } else {
        // 在指定的表中插入数据成功
        console.log('henry 在指定的表中插入数据成功:' + JSON.stringify(result));
    }
});

打印结果:

henry 在指定的表中插入数据成功:
{
    "fieldCount":0,"affectedRows":1,"insertId":1,"serverStatus":2,"warningCount":0,"message":"","protocol41":true,"changedRows":0
}

如果插入的数据是变量(比如是用户提交上来的数据),那么,sql 语句可以这样写:

// 在指定的表中插入数据(数据作为变量)
const strSql7 = "insert into qianguyihao_table5 (name, age) values (?, ?)";

connection.query(strSql7, ['张三', '34'], (err, result) => {
    if (err) {
        // 插入数据失败
        console.log(err);
    } else {
        // 在指定的表中插入数据成功
        console.log(' henry 在指定的表中插入数据成功:' + JSON.stringify(result));
    }
});