A. 菜鸟教程中的nodejs连接mysql数据库教程存在sql注入问题吗
是否有漏洞与代码有关,与此无关
其中主流的连接MySQL的方式是用mysql或者mysql2包,它们只是提供了调用驱动的api。很多框架中包括egg,nest都是基于此封装的。
但这不是SQL注入的关键,它只是一种连接方式。它只管连接,不管其他的,存不存在SQL注入完全靠写代码的人本身啊。
一句脚本本没有问题(知道不让直接放sql的,也是放注入),但是你如果让SQL变成由用户输入拼接而成,那就存在SQL注入的风险。
你应该去了解SQL注入的原理,然后进行防患,网络就能找到,然后可以用ORM,一般都对输入做了处理,还能避免直接写SQL(但其实难的地方还得自己写)。
有不理解可以追问。
B. js如何连接和操作腾讯云mysql数据库
首先是登陆腾讯云,登陆之后可以领取新手礼包,如图
二、使用一个demo来说明如何操作云mysql数据库- var mysql = require(‘mysql’);
- var connection = mysql.createConnection({
- host:'',
- user:'root',
- password:'123abc',
- database:' nodejs',
- port:6445
- })
- connection.connect();
- /**
- * 增加员工
- */function addEmployee(){
- var employeeInsertSql = 'INSERT INTO employee(name,sex,age,email) VALUES(?,?,?,?)';
- var employeeInsertSql_Params = ['Tim','男',22,'[email protected]']
- connection.query(employeeInsertSql,employeeInsertSql_Params,function(err,result){
- if(err) console.log('[INSERT ERR]-',err.message);
- console.log(result);
- }) }addEmployee()
- }
- /**
- * 更新员工
- */
- function insertEmployee(){
- var employeeUpdateSql = "UPDATE employee SET name = ? WHERE age =?";
- var employeeUpdateSql_Params = ['Peter',22];
- connection.query(employeeUpdateSql,employeeUpdateSql_Params,function(err,result){
- if(err) console.log('[UPDATE ERR]-',err.message);
- console.log(result);
- })}
- insertEmployee();
- /**
- *查询员工
- */ function getEmployee(){
- var employeeGetSql = "SELECT * FROM employee";
- connection.query(employeeGetSql,function(err,result){
- if(err) console.log('[SELECT ERR]-',err.message);
- console.log(result);
- })}
- /**
- *删除员工
- */ function deleteEmployee(){
- var employeeDeleteSql = "DELETE employee WHERE name = ?";
- var employeeDeleteSql_Params = 'Peter';
- connection.query(employeeDeleteSql,employeeDeleteSql_Params,function(err,result){
- if(err) console.log('[DELETE ERR]-',err.message);
- console.log(result);
- })
- }deleteEmployee();
- var mysql = require('mysql');var connection = mysql.createConnection({
- host:'',
- user:'root',
- password:'',
- database:'nodejs',
- port:})connection.connect();/**
- * 增加员工
- * @param {String} employee
- * @param {Function} callback
- */exports.addEmployee=function(employee,callback){
- var employeeInsertSql = 'INSERT INTO employee(name,sex,age,email) VALUES(?,?,?,?)';
- var employeeInsertSql_Params = [employee.name,employee.sex,employee.age,employee.email]
- connection.query(employeeInsertSql,employeeInsertSql_Params,callback)}/**
- * 更新员工
- * @param {String} employee
- * @param {Function} callback
- */exports.updateEmployee = function(name,age){
- var employeeUpdateSql = "UPDATE employee SET name = ? WHERE age =?";
- var employeeUpdateSql_Params = ['Peter',22];
- connection.query(employeeUpdateSql,employeeUpdateSql_Params,function(err,result){
- if(err) console.log('[UPDATE ERR]-',err.message);
- console.log(result);
- })}/**
- * 查询员工
- *
- */exports.getEmployee = function(){
- var employeeGetSql = "SELECT * FROM employee";
- connection.query(employeeGetSql,callback)}/**
- * 删除员工
- * @param {String} name
- */exports.deleteEmployee = function(name){
- var employeeDeleteSql = "DELETE employee WHERE name = ?";
- var employeeDeleteSql_Params = 'Peter';
- connection.query(employeeDeleteSql,employeeDeleteSql_Params,callback)
- }再在根目录下新建index.js,代码如下var db = require('./model/employee_two');//增加员工var employee = {
- name:'lisa',
- age:22,
- sex:"女",
- email:'[email protected]'}db.addEmployee(employee,function(err,result){
- if(err) console.log("[INSERT err]-",err.message)
- console.log(result);})//删除员工db.deleteEmployee('Peter',function(err,result){
- if(err) console.log("[DELETE err]-",err.message)
- console.log(result);})//更新员工db.updateEmployee('Tim',23,function(err,result){
- if(err) console.log("[UPDATE err]-",err.message)
- console.log(result);})//查询员工db.getEmployee(function(err,result){
- if(err) console.log("[GET err]-",err.message)
- console.log(result);})
1.在实例上上新建一个为nodejs的数据库,然后新建一个为employee的表,新建四个字段 name sex age email除了年龄为int其它的全部为varchar格式
2.新建一个TimLiu的文件夹,打开cmd,cd TimLiu, 初始化项目npm init ,按照它的提示一步一步的操作即可,安装mysql模块,npm insitall mysql, 这个模块的作用主要是连接mysql数据库。
3.新建一个model.js 文件,
这里的host为我们在腾讯云上开通的外地址,端口号也是在外网地址里面,注意要把外网地址写分开,用户为默认的管理员用户,密码为我们在云平台上设置的密码,数据库为我们创建的nodejs数据库。
接下来我们对数据库进行增删改查操作
getEmployee();
这样我们就可以愉快的操作数据库了
如果大家想把项目更模块化操作,可在model下面新建一个employee_two.js,代码如下
C. nodejs简单访问及操作mysql数据库的方法示例
本文实例讲述了nodejs简单访问及操作mysql数据库的方法。分享给大家供大家参考,具体如下:
var
mysql
=
require('mysql');
//调用MySQL模块
mysql模块要安装
$
npm
install
mysql
//创建一个connection
var
connection
=
mysql.createConnection({
host
:
'127.0.0.1',
//主机
user
:
'root',
//MySQL认证用户名
password
:
'',
//MySQL认证用户密码
port:
'3306',
//端口号
database:''
//数据库名
});
//创建一个connection
connection.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);
});
//关闭connection
connection.end(function(err){
if(err){
return;
}
console.log('[connection
end]
succeed!');
});
注:nodejs在操作数据库的时候不用设置数据库的编码格式
set
names
utf8
希望本文所述对大家nodejs程序设计有所帮助。
您可能感兴趣的文章:nodejs连接mysql数据库简单封装示例-mysql模块nodejs进阶(6)—连接MySQL数据库示例nodejs实现的连接MySQL数据库功能示例Nodejs连接mysql并实现增、删、改、查操作的方法详解nodeJs实现基于连接池连接mysql的方法示例nodejs中操作mysql数据库示例NodeJS链接MySql数据库的操作方法Nodejs使用mysql模块之获得更新和删除影响的行数的方法NodeJs使用Mysql模块实现事务处理实例nodejs连接mysql数据库及基本知识点详解
D. NodeJS,mysql2/promise,连接池执行,将数据复制到另一个数据库
产品开发了新版本,数据不兼容,新版本的数据结构比旧版本复杂一些,目前,旧版本是在线系统,需要将旧版本程序的数据适配至新版本程序。数据库是MySQL,这里选择使用NodeJS来完成。
使用的版本:
需要的依赖
案例一,单表的数据同步:
databasemysqlmysql.tools.js
databasemysql2mysql2.tools.js
syncdata0.basesyncData.js
syncdata1.manufactormain.manufactor.js
syncdata2.brandmain.brand.js
syncdata3.categorymain.category.js
案例二,关联表的数据同步:
databasemysql2mysql2.promise.tools.js
syncdata4.general_namemain.general_name.js
syncdata5.goodsmain.goods.js
E. 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!');
});
关于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();
删除
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();
查找
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 %s',results[i].name,results[i].end_time);
}
}
});
connection.end();
修改
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();
结束连接其实有两种方法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 ;262728293031323334
- 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 %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;');
waitForConnections
connectionLimit
连接数限制,默认:10queueLimit
最大连接请求队列限制,设置为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();
使用连接池
在数据库中执行如下代码创建一个存储过程
调用示例:
1.连接池的创建,使用createPool方法,options和createConntion一致;
2.其它连接池配置选项
当连接池没有连接或超出最大限制时,设置为true且会把连接放入队列,设置为false会返回error
断开重连
示例代码:
首先关闭mysql服务,然后执行程序,会一直打印断线重连,当再次开启mysql服务后,打印连接成功。
F. js怎样连接和调用mysql数据库
我知道 ie 怎么连接,别的浏览器不行。首先先去mysql官网下载个 odbc 然后安装,安装完再去控制面板找到“管理工具”--》“(ODBC)数据源”--》(如果是在自己电脑上测试就选
“用户DSN”,如果想被别人访问就选“系统DSN”) 然后添加mysqlodbc,然后把驱动的名字记下来(不是你起的名字,是后面自带的名字!),准备工作做完,我们就可以通过代码访问数据库了。(注:我第一次安装ODBC,用js调用时提示我未知数据源一类的话,卸载ODBC后再次安装ODBC就正常了) 用 ie 先调用odbc驱动 然后操作mysql,话不多说,上代码!
//创建数据库连接对象
var conn = new ActiveXObject("ADODB.Connection");
//创建数据集对象
var rs = new ActiveXObject("ADODB.Recordset");
try{
//MySQL ODBC 5.3 ANSI Driver 这个就是我刚才说让你记得驱动的名字
var connectionstring = "Driver={MySQL ODBC 5.3 ANSI Driver};Server=127.0.0.1;User=root;Password=root;Database=mysql;Option=3;Port=3306";
console.log(connectionstring);
//打开连接
conn.open(connectionstring);
//查询语句
var sql = " select * from table1 ";
//打开数据集(即执行查询语句)
rs.open(sql,conn);
//(或者rs=conn.execute(sql);)
//遍历所有记录
while(!rs.eof){
//WScript是Windows 的脚本宿主对象,详细情况请在windows帮助里查找。
//WScript.Echo输出记录的内容
document.write(rs.Fields("id") + "\t" + rs.Fields("name") + "\n");
//下一条记录
rs.moveNext();
}
//关闭记录集
rs.close();
//关闭数据库连接
conn.close();
} catch(e){
//异常报告
document.write(e.message);
} finally{
//
}