使用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('✅ 事务提交成功');
});
});
});
});
暂无评论,快来发表第一条评论吧~