关于node操作mysql数据库示例代码分享

这篇文章主要介绍了node操作mysql数据库,结合实例形式较为详细的分析了node操作数据库的连接、增删改查、事务处理及错误处理相关操作技巧,需要的朋友可以参考下

本文实例讲述了node操作mysql数据库的方法。分享给大家供大家参考,具体如下:

1、建立数据库连接createConnection(Object)方法

该方法接受一个对象作为参数,该对象有四个常用的属性host,user,password,database。与php中链接数据库的参数相同。属性列表如下:

host连接数据库所在的主机名. (默认: localhost)port连接端口. (默认: 3306)localAddress用于TCP连接的IP地址. (可选)socketPath链接到unix域的路径。在使用host和port时该参数会被忽略.userMySQL用户的用户名.passwordMySQL用户的密码.database链接到的数据库名称 (可选).charset连接的字符集. (默认: ‘UTF8_GENERAL_CI’.设置该值要使用大写!)timezone储存本地时间的时区. (默认: ‘local’)stringifyObjects是否序列化对象. See issue #501. (默认: ‘false’)insecureAuth是否允许旧的身份验证方法连接到数据库实例. (默认: false)typeCast确定是否讲column值转换为本地Javascript类型列值. (默认: true)queryFormat自定义的查询语句格式化函数.supportBigNumbers数据库处理大数字(长整型和含小数),时应该启用 (默认: false).bigNumberStrings启用 supportBigNumbers和bigNumberStrings 并强制这些数字以字符串的方式返回(默认: false).dateStrings强制日期类型(TIMESTAMP, DATETIME, DATE)以字符串返回,而不是一javascript Date对象返回. (默认: false)debug是否开启调试. (默认: false)multipleStatements是否允许在一个query中传递多个查询语句. (Default: false)flags链接标志.

还可以使用字符串连接数据库例如:

var connection = mysql.createConnection('mysql://user:pass@host/db?debug=true&charset=BIG5_CHINESE_CI&timezone=-0700');

2、结束数据库连接end()destroy()

end()接受一个回调函数,并且会在query结束之后才触发,如果query出错,仍然会终止链接,错误会传递到回调函数中处理。

destroy()立即终止数据库连接,即使还有query没有完成,之后的回调函数也不会在触发。

3、创建连接池 createPool(Object)  Object和createConnection参数相同。

可以监听connection事件,并设置session值

pool.on('connection', function(connection) { connection.query('SET SESSION auto_increment_increment=1')});

connection.release()释放链接到连接池。如果需要关闭连接并且删除,需要使用connection.destroy()

pool除了接受和connection相同的参数外,还接受几个扩展的参数

createConnection用于创建链接的函数. (Default: mysql.createConnection)waitForConnections决定当没有连接池或者链接数打到最大值时pool的行为. 为true时链接会被放入队列中在可用是调用,为false时会立即返回error. (Default: true)connectionLimit最大连接数. (Default: 10)queueLimit连接池中连接请求的烈的最大长度,超过这个长度就会报错,值为0时没有限制. (Default: 0)

4、连接池集群

允许不同的host链接

// createvar poolCluster = mysql.createPoolCluster();poolCluster.add(config); // anonymous grouppoolCluster.add('MASTER', masterConfig);poolCluster.add('SLAVE1', slave1Config);poolCluster.add('SLAVE2', slave2Config);// Target Group : ALL(anonymous, MASTER, SLAVE1-2), Selector : round-robin(default)poolCluster.getConnection(function (err, connection) {});// Target Group : MASTER, Selector : round-robinpoolCluster.getConnection('MASTER', function (err, connection) {});// Target Group : SLAVE1-2, Selector : order// If can't connect to SLAVE1, return SLAVE2. (remove SLAVE1 in the cluster)poolCluster.on('remove', function (nodeId) {   console.log('REMOVED NODE : ' + nodeId); // nodeId = SLAVE1});poolCluster.getConnection('SLAVE*', 'ORDER', function (err, connection) {});// of namespace : of(pattern, selector)poolCluster.of('*').getConnection(function (err, connection) {});var pool = poolCluster.of('SLAVE*', 'RANDOM');pool.getConnection(function (err, connection) {});pool.getConnection(function (err, connection) {});// destroypoolCluster.end();

链接集群的可选参数

canRetry值为true时,允许连接失败时重试(Default: true)removeNodeErrorCount当连接失败时 errorCount 值会增加. 当errorCount 值大于 removeNodeErrorCount 将会从PoolCluster中删除一个节点. (Default: 5)defaultSelector默认选择器. (Default: RR)RR循环. (Round-Robin)RANDOM通过随机函数选择节点.ORDER无条件地选择第一个可用节点.

5、切换用户/改变连接状态

Mysql允许在比断开连接的的情况下切换用户

connection.changeUser({user : 'john'}, function(err) { if (err) throw err;});

参数

user新的用户 (默认为早前的一个).password新用户的新密码 (默认为早前的一个).charset新字符集 (默认为早前的一个).database新数据库名称 (默认为早前的一个).

6、处理服务器连接断开

var db_config = {  host: 'localhost',  user: 'root',  password: '',  database: 'example'};var connection;function handleDisconnect() { connection = mysql.createConnection(db_config); // Recreate the connection, since                         // the old one cannot be reused. connection.connect(function(err) {       // The server is either down  if(err) {                   // or restarting (takes a while sometimes).   console.log('error when connecting to db:', err);   setTimeout(handleDisconnect, 2000); // We introduce a delay before attempting to reconnect,  }                   // to avoid a hot loop, and to allow our node script to });                   // process asynchronous requests in the meantime.                     // If you're also serving http, display a 503 error. connection.on('error', function(err) {  console.log('db error', err);  if(err.code === 'PROTOCOL_CONNECTION_LOST') { // Connection to the MySQL server is usually   handleDisconnect();             // lost due to either server restart, or a  } else {                   // connnection idle timeout (the wait_timeout   throw err;                 // server variable configures this)  } });}handleDisconnect();

7、转义查询值

为了避免SQL注入攻击,需要转义用户提交的数据。可以使用connection.escape() 或者 pool.escape()

例如:

var userId = 'some user provided value';var sql  = 'SELECT * FROM users WHERE id = ' + connection.escape(userId);connection.query(sql, function(err, results) {   // ...});

或者使用?作为占位符

connection.query('SELECT * FROM users WHERE id = ?', [userId], function(err, results) {   // ...});

不同类型值的转换结果

Numbers 不变
Booleans 转换为字符串 ‘true’ / ‘false’
Date 对象转换为字符串 ‘YYYY-mm-dd HH:ii:ss’
Buffers 转换为是6进制字符串
Strings 不变
Arrays => [‘a’, ‘b’] 转换为 ‘a’, ‘b’
嵌套数组 [[‘a’, ‘b’], [‘c’, ‘d’]] 转换为 (‘a’, ‘b’), (‘c’, ‘d’)
Objects 转换为 key = ‘val’ pairs. 嵌套对象转换为字符串.
undefined / null ===> NULL
NaN / Infinity 不变. MySQL 不支持这些值,  除非有工具支持,否则插入这些值会引起错误.

Imagine By Magic Studio Imagine By Magic Studio

AI图片生成器,用文字制作图片

Imagine By Magic Studio 79 查看详情 Imagine By Magic Studio

转换实例:

var post = {id: 1, title: 'Hello MySQL'};var query = connection.query('INSERT INTO posts SET ?', post, function(err, result) {   // Neat!});console.log(query.sql); // INSERT INTO posts SET `id` = 1, `title` = 'Hello MySQL'

或者手动转换

var query = "SELECT * FROM posts WHERE title=" + mysql.escape("Hello MySQL");console.log(query); // SELECT * FROM posts WHERE title='Hello MySQL'

8、转换查询标识符

如果不能信任SQL标识符(数据库名、表名、列名),可以使用转换方法mysql.escapeId(identifier);

var sorter = 'date';var query = 'SELECT * FROM posts ORDER BY ' + mysql.escapeId(sorter);console.log(query); // SELECT * FROM posts ORDER BY `date`

支持转义多个

var sorter = 'date';var query = 'SELECT * FROM posts ORDER BY ' + mysql.escapeId('posts.' + sorter);console.log(query); // SELECT * FROM posts ORDER BY `posts`.`date`

可以使用??作为标识符的占位符

var userId = 1;var columns = ['username', 'email'];var query = connection.query('SELECT ?? FROM ?? WHERE id = ?', [columns, 'users', userId], function(err, results) {   // ...});console.log(query.sql); // SELECT `username`, `email` FROM `users` WHERE id = 1

9、准备查询

可以使用mysql.format来准备查询语句,该函数会自动的选择合适的方法转义参数。

var sql = "SELECT * FROM ?? WHERE ?? = ?";var inserts = ['users', 'id', userId];sql = mysql.format(sql, inserts);

10、自定义格式化函数

connection.config.queryFormat = function (query, values) {   if (!values) return query;   return query.replace(/:(w+)/g, function (txt, key) {    if (values.hasOwnProperty(key)) {     return this.escape(values[key]);    }    return txt;   }.bind(this));};connection.query("UPDATE posts SET title = :title", { title: "Hello MySQL" });

11、获取插入行的id

当使用自增主键时获取插入行id,如:

connection.query('INSERT INTO posts SET ?', {title: 'test'}, function(err, result) {   if (err) throw err;   console.log(result.insertId);  });

12、流处理

有时你希望选择大量的行并且希望在数据到达时就处理他们,你就可以使用这个方法

var query = connection.query('SELECT * FROM posts');  query   .on('error', function(err) {    // Handle error, an 'end' event will be emitted after this as well   })   .on('fields', function(fields) {    // the field packets for the rows to follow   })   .on('result', function(row) {    // Pausing the connnection is useful if your processing involves I/O    connection.pause();    processRow(row, function() {     connection.resume();    });   })   .on('end', function() {    // all rows have been received   });

13、混合查询语句(多语句查询)

因为混合查询容易被SQL注入攻击,默认是不允许的,可以使用:

var connection = mysql.createConnection({multipleStatements: true});

开启该功能。

混合查询实例:

connection.query('SELECT 1; SELECT 2', function(err, results) {   if (err) throw err;   // `results` is an array with one element for every statement in the query:   console.log(results[0]); // [{1: 1}]   console.log(results[1]); // [{2: 2}]  });

同样可以使用流处理混合查询结果:

var query = connection.query('SELECT 1; SELECT 2');  query   .on('fields', function(fields, index) {    // the fields for the result rows that follow   })   .on('result', function(row, index) {    // index refers to the statement this result belongs to (starts at 0)   });

如果其中一个查询语句出错,Error对象会包含err.index指示错误语句的id,整个查询也会终止。

混合查询结果的流处理方式是做实验性的,不稳定。

14、事务处理

connection级别的简单事务处理

connection.beginTransaction(function(err) {   if (err) { throw err; }   connection.query('INSERT INTO posts SET title=?', title, function(err, result) {    if (err) {     connection.rollback(function() {      throw err;     });    }    var log = 'Post ' + result.insertId + ' added';    connection.query('INSERT INTO log SET data=?', log, function(err, result) {     if (err) {      connection.rollback(function() {       throw err;      });     }     connection.commit(function(err) {      if (err) {       connection.rollback(function() {        throw err;       });      }      console.log('success!');     });    });   });  });

15、错误处理

err.code = stringerr.fatal => boolean

以上就是关于node操作mysql数据库示例代码分享的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/798313.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月26日 16:50:21
下一篇 2025年11月26日 16:50:57

相关推荐

  • PI硬币价格预测今天:导航不确定性

    看看pi coin今天的价格预测,了解市场不确定性中的最新趋势、关键水平和潜在情景。 Pi Coin的故事仍然是加密爱好者的热门话题。大家最关心的问题是:今天PI币的价格走势如何?尽管PI Network推出了新工具,但这并不一定立刻带来上涨动力。我们来分析一下影响Pi Coin价格的因素以及技术图…

    2025年12月8日
    000
  • 值得关注的AltCoins:BNB的遗产和Qubetics的Exchange首次亮相

    探索诸如bnb之类的altcoins的兴起以及qubetics即将到来的交易所上市引发的关注。 qubetics会是下一个大赢家吗? 值得关注的AltCoins:BNB的传奇与Qubetics的交易所首发 Altcoin市场再次焕发生机,让人不禁联想到当年Binance Coin(BNB)初现锋芒时…

    2025年12月8日
    000
  • 无需下载免费的行情网站app入口 币圈免费行情分析平台官网地址

    许多平台提供行情服务,其中不少需要下载特定的移动应用程序。然而,对于希望无需安装额外软件、直接通过网页浏览器就能免费查看币圈行情并进行初步分析的用户,一些知名的加密货币交易平台官网本身就是极佳的选择。这些平台不仅提供交易功能,其网页版行情板块通常功能强大且完全免费开放,是获取市场动态、了解币种价格波…

    2025年12月8日 好文分享
    000
  • AI代理,代币角色和资本化:导航Web3边境

    探索ai代理在web3中的崛起、其代币经济以及资本大量流入这一变革性领域。ai代理是否预示着链上交互的未来? AI代理、代币生态与资本浪潮:深入Web3前沿 自2025年以来,AI代理在Web3领域迅速兴起,彻底改变了用户与去中心化应用的互动方式。从DeFi到游戏,这些自主程序正在自动执行任务并推动…

    2025年12月8日
    000
  • Coinbase,Bitcoin和S&P 500:加密货币的新时代?

    探索Coinbase与标准普尔500标准普尔500的集成以及比特币的战略定位如何重塑加密市场,将机构接受与技术势头融合在一起。 Coinbase,Bitcoin和S&P 500:加密货币的新时代? Coinbase(Coin)融合到标准普尔500指数,比特币的弹性积累策略以及不断发展的调节性清晰度,…

    2025年12月8日
    000
  • 币圈交易所资源整合 2025年币圈交易App评测

    进入2025年,全球加密货币市场呈现出愈发复杂和多元化的竞争格局。数字资产的普及度持续提升,吸引了大量新增用户进入这个充满机遇与挑战并存的领域。对于每一位市场参与者而言,选择一个安全、高效、功能全面的交易平台是进行资产管理和投资布局的关键一步。市场的演变推动着各大交易所不断进行技术革新与服务整合,它…

    2025年12月8日 好文分享
    000
  • SUI价格,现实世界中的资产和区块链集成:一个新时代?

    探索SUI在现实世界中的兴起,区块链整合及其对加密市场的影响,包括价格分析和未来潜力。 Sui正在浪潮,将现实世界的资产与区块链技术融为一体。让我们深入了解SUI的价格行动,它进入了现实世界中的资产(RWAS)以及更广泛的区块链集成。这是未来吗? SUI价格势头:$ 3的眼睛 Sui的价格显示出生命…

    2025年12月8日
    000
  • Chainlink(LINK)质押功能上线,预言机龙头开启新篇章?

    Chainlink作为预言机龙头,其质押(Staking)功能的上线是其生态发展中的一个里程碑事件。本文将详细阐述Chainlink质押功能的核心机制,分析它如何为网络带来更高的安全性,并探讨这一功能为何被视为开启了Chainlink发展的新篇章。通过对质押目的和过程的讲解,可以清晰地了解其对整个网…

    2025年12月8日
    000
  • Cosmos(ATOM)跨链枢纽价值被低估?生态爆发前夜信号显现

    本文将围绕Cosmos(ATOM)作为跨链枢纽的价值进行探讨,分析其当前可能被市场低估的原因,并通过解读其核心技术、经济模型演进以及生态发展的关键信号,阐述为何Cosmos生态可能正处于爆发的前夜。文章将深入讲解其底层协议与新功能,帮助理解其价值捕获能力的提升过程。 2025主流加密货币交易所官网注…

    2025年12月8日
    000
  • 加密货币,Web3和AI:绘制趋势并发现宝石

    探索加密货币、web3 与人工智能的最新动向与深度见解,聚焦这一快速演进领域中的核心参与者和新兴机遇。 加密货币、Web3 与 AI 的交汇正在重塑数字世界格局,带来挑战的同时也开启了前所未有的机会。让我们深入探讨这一活跃领域的最新动态、发展趋势以及关键洞见。 崭露头角的加密项目 加密市场虽经历波动…

    2025年12月8日
    000
  • Chainlink的17美元突破:由万事达卡合作伙伴关系推动的看涨势头

    chainlink(link)正展现出强劲的上涨趋势,有望触及17美元。受与万事达卡达成重要合作伙伴关系的推动,chainlink在连接去中心化金融(defi)与传统金融(tradfi)方面发挥了桥梁作用。 Chainlink冲击17美元:万事达合作点燃看涨情绪 在与万事达卡建立战略合作的支持下,C…

    2025年12月8日
    000
  • 币圈前十交易平台有哪些 2025年交易所App榜单排名

    数字资产的世界充满了活力与变迁,交易平台作为连接投资者与数字货币市场的核心桥梁,其重要性不言而喻。用户在选择一个交易平台时,会考量其安全性、流动性、用户体验、资产多样性以及客户服务等多个维度。一个功能全面且运行稳定的应用程序,能够极大地提升用户的交易效率和资产管理体验。市场上涌现出众多交易平台,它们…

    2025年12月8日 好文分享
    000
  • BlockDag:这是增长最快的加密货币,准备爆炸吗?

    blockdag凭借其创新技术与亮眼的预售表现吸引了众多关注。但这是否真的是目前发展最快的加密货币呢? BlockDag正在引发热议!该项目设定了6亿美元的融资目标,并以实际进展支撑其计划。但它真的能够兑现承诺吗? Blockdag:只是炒作还是真有实力? 在加密领域,炒作层出不穷,但一些项目确实在…

    2025年12月8日
    000
  • Grayscale的前20名加密货币排名:Avax和Morpho晋级!

    灰度更新了其2025年第三季度前20大加密货币榜单,avax和morpho强势加入,而一些老牌项目仍未上榜。让我们一起看看这些变化背后的动因与趋势。 Crypto Fam,什么是最新动态?Grayscale刚刚发布了最新的第三季度前20名加密资产名单,整个社区都在热烈讨论。市场格局正在发生变化,我们…

    2025年12月8日
    000
  • Ruvi AI:被审核的令牌回声在加密货币空间中

    ruvi ai凭借其以实用为导向的模型、经过审核的安全机制以及结构化增长路径,正在引发广泛关注。这是否将成为下一个重大投资机会? Ruvi AI(简称Ruvi)通过结合人工智能与区块链技术,致力于打造营销与娱乐领域的创新解决方案,正逐步走向聚光灯下。强调实用性与安全保障,这是否正是你一直在寻找的加密…

    2025年12月8日
    000
  • Ruvi AI:实用模型推动价值激增

    发现Ruvi AI的创新实用工具模型如何引发价值激增,为传统加密货币提供了令人信服的替代方案。 在不断发展的加密货币世界中,Ruvi AI(Ruvi)正在以重点关注现实世界实用程序和结构化的增长,使其与更投机的标记区分开来。让我们深入了解为什么Ruvi AI经历了价值激增以及使其实用性模型如此引人注…

    2025年12月8日
    000
  • 卡尔达诺(ADA)创始人Hoskinson最新访谈:Cardano的下一步计划

    本文将围绕卡尔达诺创始人Charles Hoskinson在近期访谈中透露的网络未来发展蓝图进行阐述。文章将详细解析Cardano即将进入的关键阶段,包括如何实现完全的去中心化治理,以及在性能和可扩展性方面的具体举措,旨在帮助读者清晰地了解Cardano接下来的发展路径和核心计划。 2025卡尔达诺…

    2025年12月8日
    000
  • Uniswap(UNI)遭遇强劲对手,DEX龙头地位会被颠覆吗?

    去中心化交易所(DEX)的竞争日趋激烈,Uniswap作为曾经无可争议的领导者,其地位正面临来自各方的严峻挑战。本文将围绕这一问题展开探讨,通过分析Uniswap自身的核心优势、当前面临的竞争格局以及影响DEX市场未来的关键变量,来阐释其龙头地位是否稳固,并探讨其可能的发展路径。 2025主流加密货…

    2025年12月8日
    000
  • Avalanche(AVAX)子网生态爆发,哪些项目最具潜力?

    随着Avalanche子网技术的成熟,其生态系统正经历快速扩张。本文将深入探讨Avalanche子网的核心优势,并为您解析当前生态中一些备受关注且具有潜力的项目。我们将通过介绍子网的基本概念,并列举不同领域的代表性项目,为您提供一个评估其潜力的分析框架,帮助您理解这些项目能够脱颖而出的原因。 202…

    2025年12月8日
    000
  • LTC看跌,湿度低,Web3 AI高:加密预测是什么?

    litecoin和shiba inu遭遇市场阻力,而web3 ai凭借其人工智能技术的加密工具逐渐崭露头角。web3 ai是否会成为下一个爆发的加密项目? LTC走势疲软,市场情绪低迷,Web3 AI表现强劲:加密货币未来预测 加密货币市场如同坐过山车一般波动剧烈。LTC和SHIB面临下行压力,而W…

    2025年12月8日
    000

发表回复

登录后才能评论
关注微信