❤Node系列优化使用和代码优化(番外篇)
❤Node系列优化使用和代码优化(番外篇)
1、用户接口部分
接下来我们对于用户接口部分我们进行一些优化
export function editUserStatus (n) {
return request({
url: '/api/user/status',
method: 'put',
data:n
})
}
向其中插入一个SQL语句尝试一下
INSERT INTO user (name, age,state) VALUES ('lin', 18,1)
如果前台的参数没有传,那么默认会出现一种情况
用户前面判断显示可以使用,但是用户其实真实状态是null
如何添加一个用户,然后默认这个用户角色是可以正常使用的呢?
这就需要我们改一下我们的增加用户的接口,这个接口使默认用户权限是初始化打开的
我们将 0 为初始化可以使用 1 为正常使用 2 为禁用以后
改写新增用户接口
// 准备 SQL 插入语句
const insertSql = `INSERT INTO user (name, age,state) VALUES (?, ?,1)`;
用户禁用和启用
app.put('/api/user/status', (req, res) => {
// console.log(req.body);
const { name, age } = req.body; // 从请求体中获取数据
const values = [state];
// 准备 SQL 插入语句
const insertSql = `UPDATE user SET state = ?`;
connectionpool.query(insertSql, values, (err, results) => {
// console.log(err,'err');
// console.log(results,'results');
if (err) {
console.error('Error querying database:', err);
res.status(500).json({ error: 'Internal server error' });
return;
}
res.json({
code: '200',
data: results,
});
});
});
2、Node文件内置模块fs
的认识
Node.js内置模块fs
(文件系统)用于处理文件系统相关的操作,为Node.js提供了处理文件系统的能力,使Node.js能够在服务器端进行文件相关的操作,读取配置文件、处理日志、操作文件数据库等
- 读取文件:使用
fs.readFile()
或fs.readFileSync()
方法来读取文件内容。 - 写入文件:使用
fs.writeFile()
或fs.writeFileSync()
方法来将数据写入文件。 - 追加文件:使用
fs.appendFile()
方法向文件中追加数据。 - 删除文件:使用
fs.unlink()
方法可以删除文件。 - 创建目录:使用
fs.mkdir()
方法创建目录。 - 删除目录:使用
fs.rmdir()
方法删除目录。 - 重命名文件或目录:使用
fs.rename()
方法可以重命名文件或目录。 - 检查文件或目录的存在性:使用
fs.access()
方法检查文件或目录是否存在。 - 获取文件或目录的信息:使用
fs.stat()
方法获取文件或目录的信息,如大小、创建时间等。
3、文件模块化优化
在 Node.js 中,可以通过模块化的方式将接口分为不同的模块进行导入,这样子我们的模块可以进行不同的导入以及导导出,使接口模块化和易于维护
新建一个productRoutes.js
const express = require('express');
const router = express.Router();
// 定义产品相关接口
router.get('/products', (req, res) => {
// 处理获取产品列表的逻辑
});
router.post('/products', (req, res) => {
// 处理创建产品的逻辑
});
module.exports = router;
在之前的app.js根目录之中进行引入
const express = require('express');
const app = express();
const userRoutes = require('./userRoutes');
const productRoutes = require('./productRoutes');
// 将用户相关接口模块挂载到 /api/user 路径下
app.use('/api/user', userRoutes);
// 将产品相关接口模块挂载到 /api/product 路径下
app.use('/api/product', productRoutes);
// 启动服务
app.listen(8888, () => {
console.log('Server is running on port 3000');
});
接下来我们尝试访问一下 http://localhost:8888/api/product
结果显示我们报错404
分析,我们使用的地址前面注意是/api/product,然后在我们的项目之中再次添加了/products ,也就是说我们正常的路径其实应该是/api/product/products
,访问地址http://localhost:8888/api/product/products
这个时候我们发现,接口已经可以正常输出了!
app.use('/api/product', productRoutes);
(1)抽离数据库模块为db.js
// 创建数据库连接池 createPool(高并发方式)
const mysql = require('mysql');
// 创建数据库连接池
const connectionPool = mysql.createPool({
host: 'localhost', // 数据库主机地址,如果是本地数据库则使用localhost
user: 'xxxx', // 数据库用户名
password: 'xxxx', // 数据库密码
database: 'xxx', // 要连接的数据库名
multipleStatements: true, // 允许执行多条语句
});
module.exports = connectionPool;
在根之中导入使用
const connectionPool = require('./server/db'); // 引入数据库连接池模块
剩下的就跟砸门之前connectionPool的正常使用一样
这里有个小插曲,就是我分离模块以后一直报500的错误,最后找了几个小时发现是单词拼写错了🤮
connectionPool 我给拼写成了connectionpool
所以要谨慎再谨慎啊
(2)抽离用户模块为 userRoutes.js
需要注意的就是路径的变化和接口的使用方式的变化
之前我们使用:/api/user
// 新增用户 POST 请求处理程序
app.post('/api/user', (req, res) => {
// console.log(req.body);
const { name, age } = req.body; // 从请求体中获取数据
const values = [name, age];
// 准备 SQL 插入语句
const insertSql = `INSERT INTO user (name, age,state) VALUES (?, ?,1)`;
connectionPool.query(insertSql, values, (err, results) => {
// console.log(err,'err');
// console.log(results,'results');
if (err) {
console.error('Error querying database:', err);
res.status(500).json({ error: 'Internal server error' });
return;
}
res.json({
code: '200',
data: results,
});
});
});
现在我们使用:/
// 新增用户 POST 请求处理程序
router.post('/', (req, res) => {
// console.log(req.body);
const { name, age } = req.body; // 从请求体中获取数据
const values = [name, age];
// 准备 SQL 插入语句
const insertSql = `INSERT INTO user (name, age,state) VALUES (?, ?,1)`;
connectionPool.query(insertSql, values, (err, results) => {
// console.log(err,'err');
// console.log(results,'results');
if (err) {
console.error('Error querying database:', err);
res.status(500).json({ error: 'Internal server error' });
return;
}
res.json({
code: '200',
data: results,
});
});
});
引入和使用用户模块部分就更改为了:
const userRoutes = require('./server/api/userRoutes'); // 引入用户路由模块
// 使用用户路由
app.use('/api/user', userRoutes);
测试一下,功能正常
(3)抽离文章模块为 articleRoutes.js
articleRoutes.js
大致如下
const express = require('express');
const router = express.Router();
const connectionPool = require('../db'); // 引入数据库连接池模块
.....
module.exports = router;
同样在我们的根目录之中进行使用:
// 引入文章模块
const articleRoutes = require('./server/api/articleRoutes');
// 使用文章接口
app.use('/api/articles', articleRoutes);
测试一下,没问题
4、文章优化
查询接口优化
之前我们查询接口是这样子的
// 标题
if (title !== undefined && title !== '' && title !== null) {
query += ' WHERE title = ?';
params.push(title);
}
// 类型
if (articletype !== undefined && articletype !== '' && articletype !== null) {
query += params.length ? ' AND' : ' WHERE';
query += ' articletype = ?';
params.push(articletype);
}
if (pageNum !== undefined && pageSize !== '' && pageSize !== null) {
query += ' LIMIT ?, ?';
let offset = (pageNum - 1) * pageSize;
params.push(offset);
params.push(parseInt(pageSize));
}
我们写了公开函数方法进行优化
优化之后就成为了:
const {addCondition,addDateRangeCondition,addPagination} = require('./apimethods.js'); // 引入封装方法
// 构建查询条件
const params = [];
query = addCondition(query, params, 'title', title); // 标题
query = addCondition(query, params, 'articletype', articletype); // 类型
query = addPagination(query, params, pageNum, pageSize); //分页条件
文章数据增加
数据增加接口优化
const insertSql = `INSERT INTO articles (title, author,articlestatus) VALUES (?, ?,1)`;
const { title, author,articletype,articlestatus } = req.body; // 从请求体中获取数据
const values = [title, author,articletype,1];
const insertSql = 'INSERT INTO articles SET ?'; // 准备 SQL 插入语句
文章图片访问
图片太大了 ,存不进去,这个时候更改我们图片存储字段(为了存储base64位的图片)
改数据库
thumburl的数据类型为
LONGTEXT,以便能够存储较长的字符串。
5、返回数据规范
之前我们返回的数据都没有规范,现在我们定义一个返回接口的规范,用来规范返回数据
// 类型推断
interface ApiResponse {
code: number;
message: string;
}
import axios, { AxiosResponse } from 'axios';
6、cors模块跨域优化
app.options('*', cors()); // 这将在所有路由上启用 CORS 的预检请求处理
转载自:https://juejin.cn/post/7377439806136254516