當前位置:首頁 » 數據倉庫 » nodejs連接資料庫
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

nodejs連接資料庫

發布時間: 2023-03-05 07:34:12

A. 菜鳥教程中的nodejs連接mysql資料庫教程存在sql注入問題嗎

是否有漏洞與代碼有關,與此無關

其中主流的連接MySQL的方式是用mysql或者mysql2包,它們只是提供了調用驅動的api。很多框架中包括egg,nest都是基於此封裝的。

但這不是SQL注入的關鍵,它只是一種連接方式。它只管連接,不管其他的,存不存在SQL注入完全靠寫代碼的人本身啊。

一句腳本本沒有問題(知道不讓直接放sql的,也是放注入),但是你如果讓SQL變成由用戶輸入拼接而成,那就存在SQL注入的風險。

你應該去了解SQL注入的原理,然後進行防患,網路就能找到,然後可以用ORM,一般都對輸入做了處理,還能避免直接寫SQL(但其實難的地方還得自己寫)。

有不理解可以追問。

B. js如何連接和操作騰訊雲mysql資料庫

首先是登陸騰訊雲,登陸之後可以領取新手禮包,如圖

二、使用一個demo來說明如何操作雲mysql資料庫

    1.在實例上上新建一個為nodejs的資料庫,然後新建一個為employee的表,新建四個欄位 name sex age email除了年齡為int其它的全部為varchar格式
    2.新建一個TimLiu的文件夾,打開cmd,cd TimLiu, 初始化項目npm init ,按照它的提示一步一步的操作即可,安裝mysql模塊,npm insitall mysql, 這個模塊的作用主要是連接mysql資料庫。
    3.新建一個model.js 文件,

  • var mysql = require(『mysql』);

  • var connection = mysql.createConnection({

  • host:'',

  • user:'root',

  • password:'123abc',

  • database:' nodejs',

  • port:6445

  • })

  • connection.connect();

  • 這里的host為我們在騰訊雲上開通的外地址,埠號也是在外網地址裡面,注意要把外網地址寫分開,用戶為默認的管理員用戶,密碼為我們在雲平台上設置的密碼,資料庫為我們創建的nodejs資料庫。
    接下來我們對資料庫進行增刪改查操作

  • /**

  • * 增加員工

  • */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);

  • })}

  • getEmployee();

  • /**

  • *刪除員工

  • */ 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();

  • 這樣我們就可以愉快的操作資料庫了

    如果大家想把項目更模塊化操作,可在model下面新建一個employee_two.js,代碼如下

  • 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);})

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;');

  • 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();

  • 首先關閉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{
//
}