Skip to content

❤Node系列优化使用和代码优化(番外篇)

1、用户接口部分

接下来我们对于用户接口部分我们进行一些优化

javascript
export function editUserStatus (n) {
    return request({
            url: '/api/user/status',
            method: 'put',
            data:n
    })
}

向其中插入一个SQL语句尝试一下

javascript
INSERT INTO user (name, age,state) VALUES ('lin', 18,1)

如果前台的参数没有传,那么默认会出现一种情况

javascript
用户前面判断显示可以使用,但是用户其实真实状态是null

如何添加一个用户,然后默认这个用户角色是可以正常使用的呢?

这就需要我们改一下我们的增加用户的接口,这个接口使默认用户权限是初始化打开的

我们将 0 为初始化可以使用 1 为正常使用 2 为禁用以后

改写新增用户接口

javascript
// 准备 SQL 插入语句
const insertSql = `INSERT INTO user (name, age,state) VALUES (?, ?,1)`;

用户禁用和启用

javascript
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能够在服务器端进行文件相关的操作,读取配置文件、处理日志、操作文件数据库等

  1. 读取文件:使用fs.readFile()fs.readFileSync()方法来读取文件内容。
  2. 写入文件:使用fs.writeFile()fs.writeFileSync()方法来将数据写入文件。
  3. 追加文件:使用fs.appendFile()方法向文件中追加数据。
  4. 删除文件:使用fs.unlink()方法可以删除文件。
  5. 创建目录:使用fs.mkdir()方法创建目录。
  6. 删除目录:使用fs.rmdir()方法删除目录。
  7. 重命名文件或目录:使用fs.rename()方法可以重命名文件或目录。
  8. 检查文件或目录的存在性:使用fs.access()方法检查文件或目录是否存在。
  9. 获取文件或目录的信息:使用fs.stat()方法获取文件或目录的信息,如大小、创建时间等。

3、文件模块化优化

在 Node.js 中,可以通过模块化的方式将接口分为不同的模块进行导入,这样子我们的模块可以进行不同的导入以及导导出,使接口模块化和易于维护

新建一个productRoutes.js

javascript
const express = require('express');
const router = express.Router();

// 定义产品相关接口
router.get('/products', (req, res) => {
  // 处理获取产品列表的逻辑
});

router.post('/products', (req, res) => {
  // 处理创建产品的逻辑
});

module.exports = router;

在之前的app.js根目录之中进行引入

javascript
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');
});

接下来我们尝试访问一下

javascript
[http://localhost:8888/api/product](http://localhost:8888/api/product)

结果显示我们报错404

分析,我们使用的地址前面注意是/api/product,然后在我们的项目之中再次添加了/products ,也就是说我们正常的路径其实应该是/api/product/products,访问地址http://localhost:8888/api/product/products这个时候我们发现,接口已经可以正常输出了!

javascript
app.use('/api/product', productRoutes);

(1)抽离数据库模块为db.js

javascript
// 创建数据库连接池 createPool(高并发方式)
const mysql = require('mysql');
// 创建数据库连接池
const connectionPool = mysql.createPool({
    host: 'localhost', // 数据库主机地址,如果是本地数据库则使用localhost
    user: 'xxxx', // 数据库用户名
    password: 'xxxx', // 数据库密码
    database: 'xxx', // 要连接的数据库名
    multipleStatements: true, //  允许执行多条语句
});

module.exports = connectionPool;

在根之中导入使用

javascript
const connectionPool = require('./server/db'); // 引入数据库连接池模块

剩下的就跟砸门之前connectionPool的正常使用一样

这里有个小插曲,就是我分离模块以后一直报500的错误,最后找了几个小时发现是单词拼写错了🤮

javascript
connectionPool  我给拼写成了connectionpool

所以要谨慎再谨慎啊

(2)抽离用户模块为 userRoutes.js

需要注意的就是路径的变化和接口的使用方式的变化

javascript

之前我们使用:/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,
        });
    });
});

引入和使用用户模块部分就更改为了:

javascript
const userRoutes = require('./server/api/userRoutes'); // 引入用户路由模块

// 使用用户路由
app.use('/api/user', userRoutes);

测试一下,功能正常

(3)抽离文章模块为 articleRoutes.js

articleRoutes.js大致如下

javascript
const express = require('express');
const router = express.Router();
const connectionPool = require('../db'); // 引入数据库连接池模块

.....
module.exports = router;

同样在我们的根目录之中进行使用:

javascript
// 引入文章模块
const articleRoutes = require('./server/api/articleRoutes'); 


// 使用文章接口
app.use('/api/articles', articleRoutes);

测试一下,没问题

4、文章优化

查询接口优化

之前我们查询接口是这样子的

javascript

// 标题
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));
}

我们写了公开函数方法进行优化

优化之后就成为了:

javascript
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);  //分页条件

文章数据增加

数据增加接口优化

javascript
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、返回数据规范

之前我们返回的数据都没有规范,现在我们定义一个返回接口的规范,用来规范返回数据

javascript
// 类型推断
interface ApiResponse {
    code: number;
    message: string;
}

import axios, { AxiosResponse } from 'axios';

6、cors模块跨域优化

javascript
app.options('*', cors()); // 这将在所有路由上启用 CORS 的预检请求处理

Released under the MIT License.