使用node向mysql插入数据方式

文章类型:实战

发布者:hp

发布时间:2026-07-03

一:前言

在开发博客系统或内容管理系统时,我们经常需要批量导入或恢复数据。本文将通过一个实际案例,介绍如何使用 Node.js 向 MySQL 数据库安全地插入数据,包括数据清洗、错误处理和插入验证的完整流程。

二:场景说明

假设我们有一个博客系统,之前因为某些原因(比如 emoji 字符导致的编码问题)有文章插入失败了。现在我们需要重新插入这些文章数据,并确保:

1. 过滤掉可能引起问题的 emoji 字符

2. 完整记录插入过程

3. 验证数据是否成功插入

4. 正确处理错误和关闭数据库连接


三:完整代码

const db = require('./config/mysql');
const { removeEmoji } = require('./plugin/removeEmoji');

// 原始数据
const articleData = {
    title: '浏览器中的AbortController',
    description: 'AbortController',
    keywords: 'AbortController',
    field: 1,
    type: 2,
    isgpt: 0,
    imgurl: '',
    preTime: '2026-04-26',
    field_name: '文章板块',
    type_name: 'Javascript',
    isShow: 1,
    content: `<h3>一、基本概念</h3><p>AbortController 是浏览器提供的一个 API...</p>`,
    info: '一、基本概念\nAbortController 是浏览器提供的一个 API...'
};

// 过滤 emoji
const cleanData = {
    ...articleData,
    content: removeEmoji(articleData.content),
    info: removeEmoji(articleData.info),
    time: Date.now()
};

console.log('准备插入文章数据...');
console.log('标题:', cleanData.title);
console.log('字段数:', Object.keys(cleanData).length);

const sql = 'INSERT INTO add_blog SET ?';

db.query(sql, cleanData, (error, results) => {
    if (error) {
        console.error('❌ 插入失败:', error.message);
        console.error('SQL 状态:', error.sqlState);
        console.error('错误代码:', error.code);
        
        db.end(() => {
            process.exit(1);
        });
        return;
    }
    
    console.log('✅ 插入成功!');
    console.log('文章 ID:', results.insertId);
    console.log('受影响的行数:', results.affectedRows);
    
    // 验证插入
    console.log('正在验证数据...');
    const checkSql = `SELECT id, title, field_name, type_name FROM add_blog WHERE id = ?`;
    db.query(checkSql, [results.insertId], (err, rows) => {
        if (err) {
            console.error('验证失败:', err.message);
        } else if (rows && rows.length > 0) {
            console.log('✅ 验证成功,数据已存在:');
            console.log('  ID:', rows[0].id);
            console.log('  标题:', rows[0].title);
            console.log('  板块:', rows[0].field_name);
            console.log('  类型:', rows[0].type_name);
        } else {
            console.log('⚠️ 未找到插入的数据');
        }
        
        db.end(() => {
            console.log('数据库连接已关闭');
            process.exit(0);
        });
    });
});

四:最佳实践

1. 使用环境变量管理数据库配置

// config/mysql.js
const mysql = require('mysql');
require('dotenv').config();

const connection = mysql.createConnection({
    host: process.env.DB_HOST,
    user: process.env.DB_USER,
    password: process.env.DB_PASSWORD,
    database: process.env.DB_NAME,
    charset: 'utf8mb4'  // 支持 emoji
});

module.exports = connection;

2. 使用 Promise 或 async/await

const util = require('util');
const query = util.promisify(db.query).bind(db);

async function insertArticle(articleData) {
    try {
        const cleanData = {
            ...articleData,
            content: removeEmoji(articleData.content),
            time: Date.now()
        };
        
        const result = await query('INSERT INTO add_blog SET ?', cleanData);
        console.log('✅ 插入成功,ID:', result.insertId);
        
        // 验证
        const rows = await query('SELECT * FROM add_blog WHERE id = ?', [result.insertId]);
        console.log('✅ 验证成功:', rows[0].title);
        
    } catch (error) {
        console.error('❌ 操作失败:', error.message);
        throw error;
    }
}

3. 批量插入优化

const articles = [article1, article2, article3];

const values = articles.map(article => [
    article.title,
    article.content,
    article.field,
    // ...
]);

const sql = 'INSERT INTO add_blog (title, content, field, ...) VALUES ?';
db.query(sql, [values], callback);

4. 使用事务保证数据一致性

db.beginTransaction((err) => {
    if (err) throw err;
    
    db.query('INSERT INTO add_blog SET ?', articleData, (error, results) => {
        if (error) {
            return db.rollback(() => {
                throw error;
            });
        }
        
        db.query('UPDATE statistics SET article_count = article_count + 1', (error) => {
            if (error) {
                return db.rollback(() => {
                    throw error;
                });
            }
            
            db.commit((err) => {
                if (err) {
                    return db.rollback(() => {
                        throw err;
                    });
                }
                console.log('✅ 事务提交成功');
            });
        });
    });
});


评论
0条评论遵守法律,文明用语,共同建设文明评论区

暂无评论,快来发表第一条评论吧~