首页 > 软件 > nodejs调用mysql返回数组后却无法通过键值相应数值

nodejs调用mysql返回数组后却无法通过键值相应数值

软件 2023-09-29

nodejs中如何操作mysql并使用(附代码)


本篇文章给大家带来的内容是关于nodejs中如何操作mysql并使用(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

安装npm install mysql测试MySQL自己下载mysql安装就不说明了,很简单的。
用官方的例子好了
var mysql = require(‘mysql’);
var connection = mysql.createConnection({
host : ‘localhost’,
user : ‘me’,
password : ‘secret’,
database : ‘my_db’
});//创建mysql链接
connection.connect();
connection.query(‘SELECT 1 + 1 AS solution’, function (error, results, fields) {
if (error) throw error;
console.log(‘The solution is: ‘, results[0].solution);
});//执行sql语句
connection.end();//关闭链接认识一下Connection Options要想创建一个数据库连接,先就要认识清楚Options
host:主机地址 (默认:localhost)
user:用户名
password:密码
port:端口号 (默认:3306)
database:数据库名
charset:连接字符集(默认:’UTF8_GENERAL_CI’,注意字符集的字母都要大写)
localAddress:此IP用于TCP连接(可选)
socketPath:连接到unix域路径,当使用 host 和 port 时会被忽略
timezone:时区(默认:’local’)
connectTimeout:连接超时(默认:不限制;单位:毫秒)
stringifyObjects:是否序列化对象(默认:’false’ ;与安全相关(https://github.com/felixge/node-mysql/issues/501)
typeCast:是否将列值转化为本地JavaScript类型值 (默认:true)
queryFormat:自定义query语句格式化方法 (https://github.com/felixge/node-mysql#custom-format)
supportBigNumbers:数据库支持bigint或decimal类型列时,需要设此option为true (默认:false)
bigNumberStrings:supportBigNumbers和bigNumberStrings启用 强制bigint或decimal列以JavaScript字符串类型返回(默认:false)
dateStrings:强制timestamp,datetime,data类型以字符串类型返回,而不是JavaScript Date类型(默认:false)
debug:开启调试(默认:false)
multipleStatements:是否许一个query中有多个MySQL语句 (默认:false)
flags:用于修改连接标志,更多详情:(https://github.com/felixge/node-mysql#connection-flags)
ssl:使用ssl参数(与crypto.createCredenitals参数格式一至)或一个包含ssl配置文件名称的字符串,目前只捆绑Amazon RDS的配置文件增、删、改、查增、删、改、查主要是sql语句来定的。
1、增加var userAddSql = ‘INSERT INTO userinfo(Id,UserName,UserPass) VALUES(0,?,?)’;
var userAddSql_Params = [‘Wilson’, ‘abcd’];
connection.query(userAddSql,userAddSql_Params,function (err, result) {
?
});2、删除var userModSql = ‘DELETE FROM userinfo’;
connection.query(userModSql,function (err, result) {
?
});3、修改var userModSql = ‘UPDATE userinfo SET UserName = ?,UserPass = ? WHERE Id = ?’;
var userModSql_Params = [‘钟慰’, ‘5678’,1];
connection.query(userModSql,userModSql_Params,function (err, result) {
?
});4.查询var userGetSql = ‘SELECT * FROM userinfo’;
connection.query(userGetSql ,function (err, result) {
?
});结束数据库连接两种方法和区别前面的示例中我在结尾处都会调用一个connection.end()方法,这个方法connection.connect()对应,一个开始,一个结束!

结束连接其实有两种方法end(),destory();
end()方法在queries都结束后执行,end()方法接收一个回调函数,queries执行出错,仍然后结束连接,错误会返回给回调函数err参数,可以在回调函数中处理!
destory()比较暴力,没有回调函数,即刻执行,不管queries是否完成!
断线重连var mysql = require(‘mysql’);
var db_config = {
host : ‘192.168.0.200’,
user : ‘root’,
password : ‘abcd’,
port: ‘3306’,
database: ‘nodesample’
};
var connection;
function handleDisconnect() {
connection = mysql.createConnection(db_config);
connection.connect(function(err) {
if(err) {
console.log(“进行断线重连:” + new Date());
setTimeout(handleDisconnect, 2000); //2秒重连一次
return;
}
console.log(“连接成功”);
});
connection.on(‘error’, function(err) {
console.log(‘db error’, err);
if(err.code === ‘PROTOCOL_CONNECTION_LOST’) {
handleDisconnect();
} else {
throw err;
}
});
}
handleDisconnect();sql链接池Pooling connections1.连接池的创建,使用createPool方法,options和createConntion一致,可以监听connection事件.
连接池会自动断线重连
var mysql = require(‘mysql’);
//创建连接池
var pool = mysql.createPool({
host : ‘192.168.0.200’,
user : ‘root’,
password : ‘abcd’
});
//监听connection事件
pool.on(‘connection’, function(connection) {
connection.query(‘SET SESSION auto_increment_increment=1’);
});

连接池可以直接使用,也可以共享一个连接或管理多个连接(引用官方示例)
//直接使用
pool.query(‘SELECT 1 + 1 AS solution’, function(err, rows, fields) {
if (err) throw err;
console.log(‘The solution is: ‘, rows[0].solution);
});
//共享
pool.getConnection(function(err, connection) {
// connected! (unless err is set)
});2.其它连接池配置选项
waitForConnections
当连接池没有连接或超出最大限制时,设置为true且会把连接放入队列,设置为false会返回error
connectionLimit 连接数限制,默认:10
queueLimit 最大连接请求队列限制,设置为0表示不限制,默认:0

3.释放
调用connection.release()方法,会把连接放回连接池,等待其它使用者使用!
其它?1. escape()

防止SQL注入,可以使用pool.escape()和connect.escape(),不多说了,自已可以试试
这样使用 ‘SELECT * FROM userinfo WHERE id = ’ + pool.escape(‘5 OR ID = 6’)

2.escapeId()
如果不能信任SQL标识符(数据库名、表名、列名),可以使用转换方法escapeId();
类似这样 ‘SELECT * FROM posts ORDER BY ’ + connect.escapeId(“date”);
3.format()
可以使用mysql.format来准备查询语句,该函数会自动的选择合适的方法转义参数。
var sql = “SELECT * FROM ? WHERE ? = ?”;
var inserts = [‘users’, ‘id’, 123];
sql = mysql.format(sql, inserts);4.自定义格式化函数
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" });

nodejs+mysql怎样操作数据库


这次给大家带来nodejs+mysql怎样操作数据库,nodejs+mysql操作数据库的注意事项有哪些,下面就是实战案例,一起来看一下。
一、几个常用的全局变量
1、__filename获取当前文件的路径
2、__dirname获取当前文件的目录
3、process.cwd()获取当前工程的目录
二、文件的引入与导出
1、使用require引入文件
2、使用module.exports导出文件中指定的变量、方法、对象
三、node项目的搭建目录结构
demo
package.json 当前项目所依赖的包或者模块
router 存放路由的文件
views 存放视图的模块
public 静态文件
module 书写模块比如数据库
app.js 主入口文件
四、将路由视图单独写在router文件中demo
1、视图视图文件
const express = require("express");
const router = express.Router();
router.get("/", (req, res) => {
res.send("hello word");
});
router.get("/article", (req, res) => {
res.send("我是文章列表");
})
module.exports = router;2、在主文件中调用
'use strict';
const express = require("express");
const app = express();
app.use("/",require("./router/03_router"))
app.use("/app",require("./router/03_router1"))
app.listen(3000);五、使用ejs模板
1、需要安装但可以不引入
npm install ejs --save2、在主文件中配置
//配置模板的文件路径
app.set("views",__dirname+"/views");
//配置模板引擎
app.set("view engine","ejs");3、使用
①、模板文件




content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">

Document


我是模板渲染的



②、在路由中渲染模板
'use strict';
const express = require("express");
const router = express.Router();
router.get("/", (req, res) => {
//可以直接使用res.render("03_index");
res.render("03_index.ejs");
});
router.get("/article", (req, res) => {
res.send("我是文章列表");
})
module.exports = router;③、主文件
'use strict';
const express = require("express");
const app = express();
//配置模板的文件路径
app.set("views",__dirname+"/views");
//配置模板引擎
app.set("view engine","ejs");
app.use("/",require("./router/03_router"))
app.use("/app",require("./router/03_router1"))
app.listen(3000);六、关于ejs模板文件的使用
1、返回数据
...
let dataset = {
name:"张三",
age:20,
books:['三国演义','西游记','红楼梦','水浒传']
}
res.render("03_index.ejs",dataset);
...2、普通的字段

<%= name %>


<%= age %>

3、迭代数组

    <% for(let i in books){%>
  • <%= books[i] %>

  • <%}%>
七、加载静态文件
1、主文件中配置
//设置静态文件的加载(js,css,img)
app.use(express.static(__dirname+"/public"));2、在模板中使用



...八、使用mysql数据库
1、在module中创建一个db.js的文件
'use strict';
const mysql = require("mysql");
/**
* 将整个方法全部暴漏出去
* @param sql sql语句
* @param arg 传递到sql语句中的参数,可以不写
* @param callback 回调函数,可以不写
*/
module.exports = function (sql,arg,callback) {
//1.创建连接(根据自己的数据库配置)
let config = mysql.createConnection({
host:"localhost", //数据库的地址
user:"root", //数据库用户名
password:"root", //数据库密码
port:"3306", //mysql数据库的端口号
database:"mybatistest" //使用那个数据库
});
//2.开始连接数据库
config.connect();
//3.对数据库的增删改查操作
config.query(sql,arg,(err,data)=>{
callback && callback(err,data);
})
//4.关闭数据库
config.end();
}2、在router视图中使用查询数据
①、引入文件
//引入数据库文件
const db = require("./../module/db");②、视图中使用
router.get("/", (req, res) => {
db("select * from m_dept",(err,data)=>{
console.log(data);
res.render("03_index.ejs",{data:data});
})
});3、新增数据
①、前端页面见代码案例
②、通过req.query获取用户数据参数
router.get("/regist",(req, res)=>{
//获取到输入参数,前提是input上要写name
console.log(req.query);
db("insert into student(name,age) values(?,?)",[req.query.username,req.query.age],(err,data)=>{
console.log(data);
if(data){
res.send("成功");
}
})
})九、关于node返回json的方式
在前后端分离开发模式中后端返回的数据一般都是json,不需要使用ejs模板引擎了
...
res.json({
info:"成功",
code:1
});
...相信看了本文案例你已经掌握了方法,更多精彩请关注Gxl网其它相关文章!
推荐阅读:
如何在项目中使用PHP静态绑定

如何使用AngularJS监听渲染

idea创建nodejs连接mysql

在 IDEA 中创建 Node.js 项目连接 MySQL 数据库,可以按照以下步骤进行操作: 打开 IDEA,选择“Create New Project”创建一个新的 Node.js 项目。 在新建项目的目录下打开终端,使用 npm 命令安装 mysql 模块,命令如下: css Copy code npm install mysql --save 在项目的根目录下创建一个名为 index.js 的文件,编写以下代码: javascript Copy code const mysql = require('mysql'); // 创建连接对象 const connection = mysql

如何使用nodejs与mysql进行数据交互

先npm install mysql

然后代码中就可以require('mysql');

就可以使用了

var mysql = require('mysql');var pool = mysql.createPool(config);pool.getConnection(function(err, connection) {
// Use the connection
connection.query( 'SELECT something FROM sometable', function(err, rows) {
// And done with the connection.
connection.end();
// Don't use the connection here, it has been returned to the pool.
});});

js代码透明,你在写好代码提交给别人的时候,或是部署的时候,用Jshaman给代码加密一下,别人就看不了你的代码了

nodejs怎么后台操作mysql

连接流程代码如下:

var mysql = require('mysql'); //调用MySQL模块//创建一个connectionvar connection = mysql.createConnection({
host : '127.0.0.1', //主机
user : 'root', //MySQL认证用户名
password:'12345',
port: '3306',
database: 'node'});//创建一个connectionconnection.connect(function(err){
if(err){
console.log('[query] - :'+err); return;
}
console.log('[connection connect] succeed!');
});
//执行SQL语句connection.query('SELECT 1 + 1 AS solution', function(err, rows, fields) {
if (err) {
console.log('[query] - :'+err); return;
}
console.log('The solution is: ', rows[0].solution);
});
//关闭connectionconnection.end(function(err){
if(err){
return;
}
console.log('[connection end] succeed!');
});12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455

关于Connection Optionos
要想创建一个数据库连接,先就要认识清楚Options

host:主机地址 (默认:localhost)

user:用户名

password:密码

port:端口号 (默认:3306)

database:数据库名

charset:连接字符集(默认:’UTF8_GENERAL_CI’,注意字符集的字母都要大写)

localAddress:此IP用于TCP连接(可选)

socketPath:连接到unix域路径,当使用 host 和 port 时会被忽略

timezone:时区(默认:’local’)

connectTimeout:连接超时(默认:不限制;单位:毫秒)

stringifyObjects:是否序列化对象(默认:’false’ ;与安全相关https://github.com/felixge/node-mysql/issues/501)

typeCast:是否将列值转化为本地JavaScript类型值 (默认:true)

queryFormat:自定义query语句格式化方法https://github.com/felixge/node-mysql#custom-format

supportBigNumbers:数据库支持bigint或decimal类型列时,需要设此option为true (默认:false)

bigNumberStrings:supportBigNumbers和bigNumberStrings启用 强制bigint或decimal列以JavaScript字符串类型返回(默认:false)

dateStrings:强制timestamp,datetime,data类型以字符串类型返回,而不是JavaScript Date类型(默认:false)

debug:开启调试(默认:false)

multipleStatements:是否许一个query中有多个MySQL语句 (默认:false)

flags:用于修改连接标志,更多详情:https://github.com/felixge/node-mysql#connection-flags

ssl:使用ssl参数(与crypto.createCredenitals参数格式一至)或一个包含ssl配置文件名称的字符串,目前只捆绑Amazon RDS的配置文件

其它:

可以使用URL形式的加接字符串,不多介绍了,不太喜欢那种格式,觉得可读性差,也易出错,想了解的可以去主页上看。

MYSQL CURD操作

增加

var mysql = require('mysql');var DATABASE = "seckill";var TABLE="seckill"var connection = mysql.createConnection({
host:'127.0.0.1',
user:'root',
password:'12345',
port:'3306',
database: DATABASE
});
connection.connect();var addVip = 'insert into seckill(name,number) values(?,?)';var param = ['100元秒杀家教机',100];
connection.query(addVip, param, function(error, result){
if(error)
{
console.log(error.message);
}else{
console.log('insert id: '+result.insertId);
}
});
connection.end();12345678910111213141516171819202122232425

删除

var mysql = require('mysql');var DATABASE = "node";var TABLE="seckill"var connection = mysql.createConnection({
host:'127.0.0.1',
user:'root',
password:'12345',
port:'3306',
database: DATABASE
});
connection.connect();var addVip = 'delete from seckill where seckill_id = 1005';
connection.query(addVip, function(error, result){
if(error)
{
console.log(error.message);
}else{
console.log('affectedRows: '+result.affectedRows);
}
});
connection.end();123456789101112131415161718192021222324

查找

var mysql = require("mysql");var DATABASE = "node";var TABLE="seckill"var connection = mysql.createConnection({
host:'127.0.0.1',
user:'root',
password:'12345',
port:'3306',
});
connection.connect();
connection.query('use '+DATABASE);
connection.query('select * from '+TABLE, function(error, results, fields){
if (error) { throw error;
} if (results) { for(var i = 0; i < results.length; i++)
{
console.log('%s\t%s',results[i].name,results[i].end_time);
}
}
});
connection.end();12345678910111213141516171819202122232425

修改

var mysql = require('mysql');var DATABASE = "seckill";var connection = mysql.createConnection({
host:'127.0.0.1',
user:'root',
password:'12345',
port:'3306',
database: DATABASE
});
connection.connect();var userSql = "update seckill set number = number-1 where seckill_id = ?";var param = [1000, 2];
connection.query(userSql, param, function (error, result) {
if(error)
{
console.log(error.message);
}else{
console.log('affectedRows: '+result.affectedRows);
}
});
connection.end();123456789101112131415161718192021

结束连接其实有两种方法end(),destory();

  • end()
    end()方法在queries都结束后执行,end()方法接收一个回调函数,queries执行出错,仍然后结束连接,错误会返回给回调函数err参数,可以在回调函数中处理!

  • destory()
    比较暴力,没有回调函数,即刻执行,不管queries是否完成!

  • 使用连接池

    在数据库中执行如下代码创建一个存储过程

  • DROP PROCEDURE IF EXISTS `P_SeckillInfo`;DELIMITER ;;CREATE DEFINER=`root`@`localhost` PROCEDURE `P_SeckillInfo`(IN ExtName VARCHAR(120),IN ExtNumber INT(11),OUT ExtReturnVal INT)

  • TOP: BEGIN

  • DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN

  • ROLLBACK;

  • SET ExtReturnVal = 0; -- Failed

  • END;

  • START TRANSACTION;

  • INSERT INTO seckill(name, number) VALUES(ExtName,ExtNumber);

  • SET ExtReturnVal = 1;

  • SELECT ExtReturnVal;

  • COMMIT;END;;

  • DELIMITER ;12345678910111213141516171819202122232425262728293031323334

  • 调用示例:

  • var mysql = require("mysql");var pool = mysql.createPool({

  • host: '127.0.0.1',

  • user: 'root',

  • password:'12345',

  • port:'3306',

  • database:'node'});//监听connection事件pool.on('connection', function(connection) {

  • connection.query('select * from seckill', function(error, results, fields){

  • if (error) { throw error;

  • } if (results) { for(var i = 0; i < results.length; i++)

  • {

  • console.log('%s\t%s',results[i].name,results[i].end_time);

  • }

  • }

  • });

  • });//连接池可以直接使用,也可以共享一个连接或管理多个连接(引用官方示例)//直接使用pool.query('SELECT 1 + 1 AS solution', function(err, rows, fields) {

  • if (err) throw err;

  • console.log('The solution is: ', rows[0].solution);

  • });//共享连接function myQuery(sql){

  • pool.getConnection(function(err, connection) {

  • connection.query(sql, function(err, result) {

  • console.log(result); //释放连接

  • connection.release();

  • }); //Error: Connection already released,应该每次到连接池中再次获取

  • // connection.query( 'SELECT * FROM seckill;', function(err, result) {

  • // console.log(result);

  • // connection.release();

  • // });

  • });

  • }

  • myQuery('SELECT * FROM seckill;');

  • myQuery('SELECT * FROM seckill;');123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172

  • 1.连接池的创建,使用createPool方法,options和createConntion一致;
    2.其它连接池配置选项 

  • waitForConnections

  • 当连接池没有连接或超出最大限制时,设置为true且会把连接放入队列,设置为false会返回error

  • connectionLimit
    连接数限制,默认:10

  • queueLimit
    最大连接请求队列限制,设置为0表示不限制,默认:0

  • 断开重连

    示例代码:

  • var mysql = require('mysql');var db_config = {

  • host: '127.0.0.1',

  • user: 'root',

  • password:'12345',

  • port:'3306',

  • database:'node'};var connection;function handleDisconnect() {

  • connection = mysql.createConnection(db_config);

  • connection.connect(function(err) {

  • if(err) {

  • console.log('进行断线重连:' + new Date());

  • setTimeout(handleDisconnect, 2000); //2秒重连一次

  • return;

  • }

  • console.log('连接成功');

  • });

  • connection.on('error', function(err) {

  • console.log('db error', err); if(err.code === 'PROTOCOL_CONNECTION_LOST') {

  • handleDisconnect();

  • } else {

  • throw err;

  • }

  • });

  • }

  • handleDisconnect();12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455

  • 首先关闭mysql服务,然后执行程序,会一直打印断线重连,当再次开启mysql服务后,打印连接成功。

    防止SQL注入

    可以使用pool.escape()和connect.escape(),示例代码:

  • var mysql = require('mysql');var pool = mysql.createPool({

  • host: '127.0.0.1',

  • user: 'root',

  • password:'12345',

  • port:'3306',

  • database:'node'});function myQuery(sql){

  • pool.getConnection(function(err,connection){

  • connection.query(sql,function(err,result){

  • //console.log(err);

  • console.log(result);

  • connection.release();

  • }); // connection.query('SELECT * FROM userinfo WHERE id = ' + pool.escape('5 OR ID = 6') ,function(err,result){

  • // //console.log(err);

  • // console.log(result);

  • // connection.release();

  • // });

  • });

  • }

  • myQuery('SELECT * FROM seckill WHERE seckill_id = ' + '1006 OR seckill_id = 1007');

  • myQuery('SELECT * FROM seckill WHERE seckill_id = ' + pool.escape('1006 OR seckill_id = 1007'));123456789101112131415161718192021222324252627282930313233343536373839404142434445464748


  • 结果可以看出,第1个query拼接条件可以被执行,而通过escape方法转义后的忽略了后面的拼接的部分!

    遇到的问题

    编码导致的问题
    1366 (HY000): Incorrect string value: ‘\xC3\xEB\xC9\xB1’ for column ‘ExtName’ at row 1
    字符编码没有统一的问题,查看数据库的编码方式命令为:
    mysql> show variables like ‘character%’;

    从以上信息可知数据库的编码为latin1,需要修改为gbk或者是utf8;


标签:编程语言 信息技术 nodejs JavaScript MySQL

大明白知识网 Copyright © 2020-2022 www.wangpan131.com. Some Rights Reserved. 京ICP备11019930号-18