学习nodejs记录

83 阅读4分钟

翻看了很多教程和文章记录一些基础知识。

一开始看的尚硅谷的教程。介绍Nodejs属性,引入express框架+MongoDB 开发了一个记账本功能。缺点是视频的项目过于简单且没有前后端分离。起着一个了解的作用。

nodejs

nodejs引入属性的方式都是通过require来引入。 module.exports暴露模块。

fs模块为文件模块。

//读取文件
fs.readFile(path[, options], callback)
fs.readFile('./files/1.txt', 'utf8', function (err, dataStr)
//写入文件
fs.writeFile(file,data[, options], callback)
//可以通过__dirname进行路径拼接
__dirname 表示当前文件所处的目录

http模块为服务器模块

// 1. 导入 http 模块
const http = require('http')
// 2. 创建 web 服务器实例
const server = http.createServer()
// 3. 为服务器实例绑定 request 事件,监听客户端的请求
server.on('request', function (req, res) {
  console.log('Someone visit our web server.')
})
// 4. 启动服务器
server.listen(8080, function () {  
  console.log('server running at http://127.0.0.1:8080')
})

npm nvm

包的版本号是以“点分十进制”形式进行定义的,总共有三位数字,例如2.24.0其中每一位数字所代表的的含义如下:

  • 第1位数字:大版本
  • 第2位数字:功能版本
  • 第3位数字: Bug修复版本

nvm ls 查看所有node版本

nvm use 16.16.0 切换到某个node版本

express

npm install -g express-generator

构建完成后通过npm start 启动项目 然后访问 http://localhost:3000

image.png

nodemon可以监听代码修改

npm i nodemon

安装后修改package.json

"scripts": {
  "start": "nodemon ./bin/www"
},

生成的项目主要修改routes里的路由部分 用于书写接口 app.js用于引入一些路由和文件配置。

数据库选择

对MongoDB(非关系型)和MySQL(关系型)都有所学习。

MongoDB

nodejs对MongoDB比较友好,安装好后直接引用。

//1. 安装 mongoose
//2. 导入 mongoose
const mongoose = require('mongoose');

//设置 strictQuery 为 true,处理禁用警告
mongoose.set('strictQuery', true);

//3. 连接 mongodb 服务 mongodb协议 默认端口号27017 数据库的名称(如果数据库不存在,自动创建)
mongoose.connect('mongodb://127.0.0.1:27017/bilibili');

//4. 设置回调
// 设置连接成功的回调  once 一次   事件回调函数只执行一次
mongoose.connection.once('open', () => {
//5. 创建文档的结构对象
//设置集合中文档的属性以及属性值的类型
   let BookSchema = new mongoose.Schema({
    	   name: String,
    	   author: String,
    	   price: Number
    });

//6. 创建模型对象  对文档操作的封装对象,mongoose.model(集合名称,结构对象)
    let BookModel = mongoose.model('books', BookSchema);
//7. 新增
  	BookModel.create({
    	name: '西游记',
    	author: '吴承恩',
    	price: 19.9
  	}, (err, data) => {
    	//判断是否有错误
    	   if(err) {
	             console.log(err);
	             return;
    	}
 //如果没有出错, 则输出插入后的文档对象
    	console.log(data); //data 插入成功后的文档对象,mongodb自定生成编号和版本号
 //8. 关闭数据库连接 (项目运行过程中, 不会添加该代码)
    	mongoose.disconnect();
  	});
});

// 设置连接错误的回调
mongoose.connection.on('error', () => {
  	console.log('连接失败');
}); 

//设置连接关闭的回调
mongoose.connection.on('close', () => {
  	console.log('连接关闭');
});

其他的引用方法查询官网文档即可,不过多赘述。

MongoDB Compass可视化工具

image.png

MySQL

安装MySQL和navicat。

image.png

安装后创建连接即可。

基础查询语句crud.

//INSERT INTO table_name (`column1`, column2, ...) 
VALUES (value1, value2, ...);
//DELETE * FROM table_name 
WHERE condition;
//UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition;
//SELECT column1, column2, ...
FROM table_name
WHERE condition;
//模糊查询  like %  
SELECT column1, column2, ...
FROM table_name
WHERE title like %xxx%;
//分页查询  0是从第0条开始 10是查询10条数据 
SELECT * FROM table_name 
LIMIT 0,10;

常见数据类型 整数类型:BIT、BOOL、TINY INT、SMALL INT、MEDIUM INT、 INT、 BIG INT

浮点数类型:FLOAT、DOUBLE、DECIMAL

字符串类型:CHAR、VARCHAR、TINY TEXT、TEXT、MEDIUM TEXT、LONGTEXT、TINY BLOB、BLOB、MEDIUM BLOB、LONG BLOB

日期类型:Date、DateTime、TimeStamp、Time、Year

其他数据类型:BINARY、VARBINARY、ENUM、SET、Geometry、Point、MultiPoint、LineString、MultiLineString、Polygon、GeometryCollection等

ORM 来与数据库进行交互

node常用的Sequelize 和 knex

Sequelize

www.sequelize.cn/

全局安装Sequelize

npm i -g sequelize-cli

安装对数据库支持的mysql2

npm i sequelize mysql2

初始化项目

sequelize init

image.png

  • config:文件用于配置数据库连接
  • migrations:如果你需要对数据库做新增表、修改字段、删除表等等操作,就需要在这里添加迁移文件了。而不是像以前那样,使用客户端软件来直接操作数据库。
  • models:这里面存放的是模型文件,当我们使用sequelize来执行增删改查时,就需要用这里的模型文件了。每个模型都对应数据库中的一张表。
  • seeders,是存放的种子文件。一般会将一些需要添加到数据表的测试数据存在这里。只需要运行一个命令,数据表中就会自动填充进一些用来测试内容的了。
//findAll 查询 SELECT * FROM ...
const users = await User.findAll();
//create 创建 
const jane = await User.create({ name: "Jane" });
//findByPk 查询某一条数据
const project = await Project.findByPk(123);
//update 改
await User.update({ lastName: "Doe" }, {  
   where: {  
     lastName: null  
   }  
});
// 删除所有名为 "Jane" 的人  
await User.destroy({  
    where: {  
     firstName: "Jane"  
    }  
});

完整代码结构

//异步获取数据库数据
router.get('/', async function (req, res, next) {
  try {
    // res.render('index', { title: 'Express' });
    //倒序
    const condition = {
      order: [['id', 'DESC']],
    };
    const articles = await Article.findAll(condition);
    res.json({ status: '0000', message: '返回成功', data: articles });
  } catch (error) {
    res.status(500).json({ status: '9999', message: '返回失败', error: [error.message] });
  }
});