cryptonodenodejspool的簡單介紹

本文目錄一覽:

如何對nodejs代碼加密?國內,除了 jshaman 還有別的nodejs保護提供商嗎?

JS代碼加密,JShaman就非常好用,國內目前好像沒有別的了,這個最專業。

關於nodejs 怎麼實現 crypto des加密

就是加密和解密使用同一個密鑰,通常稱之為「Session Key 」這種加密技術在當今被廣泛採用,如美國政府所採用的DES加密標準就是一種典型的「對稱式」加密法,它的Session Key長度為56bits。

非對稱式加密:

就是加密和解密所使用的不是同一個密鑰,通常有兩個密鑰,稱為「公鑰」和「私鑰」,它們兩個必需配對使用,否則不能打開加密文件。

加密為系統中經常使用的功能,node自帶強大的加密功能Crypto,下面通過簡單的例子進行練習。

1、加密模塊的引用:

var crypto=require(‘crypto’);

var $=require(‘underscore’);var DEFAULTS = {

encoding: {

input: ‘utf8’,

output: ‘hex’

},

algorithms: [‘bf’, ‘blowfish’, ‘aes-128-cbc’]

};

默認加密演算法配置項:

輸入數據格式為utf8,輸出格式為hex,

演算法使用bf,blowfish,aes-128-abc三種加密演算法;

2、配置項初始化:

function MixCrypto(options) {

if (typeof options == ‘string’)

options = { key: options };

options = $.extend({}, DEFAULTS, options);

this.key = options.key;

this.inputEncoding = options.encoding.input;

this.outputEncoding = options.encoding.output;

this.algorithms = options.algorithms;

}

加密演算法可以進行配置,通過配置option進行不同加密演算法及編碼的使用。

3、加密方法代碼如下:

MixCrypto.prototype.encrypt = function (plaintext) {

return $.reduce(this.algorithms, function (memo, a) {

var cipher = crypto.createCipher(a, this.key);

return cipher.update(memo, this.inputEncoding, this.outputEncoding)

+ cipher.final(this.outputEncoding)

}, plaintext, this);

};

使用crypto進行數據的加密處理。

4、解密方法代碼如下:

MixCrypto.prototype.decrypt = function (crypted) {

try {

return $.reduceRight(this.algorithms, function (memo, a) {

var decipher = crypto.createDecipher(a, this.key);

return decipher.update(memo, this.outputEncoding, this.inputEncoding)

+ decipher.final(this.inputEncoding);

}, crypted, this);

} catch (e) {

return;

}

};

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』 ;與安全相關)

typeCast:是否將列值轉化為本地JavaScript類型值 (默認:true)

queryFormat:自定義query語句格式化方法 

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:用於修改連接標誌,更多詳情:

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線程池能分配多少線程

nodejs 線程池最大128個線程。

__o是在主線程中做的,線程池用來運行文件io和c++ addon,所以增加線程池對於並發影響不大。

_枚嗪擻攀疲朧褂_luster或者乾脆上pm2。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/241898.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 12:44
下一篇 2024-12-12 12:44

相關推薦

  • Python簡單數學計算

    本文將從多個方面介紹Python的簡單數學計算,包括基礎運算符、函數、庫以及實際應用場景。 一、基礎運算符 Python提供了基礎的算術運算符,包括加(+)、減(-)、乘(*)、除…

    編程 2025-04-29
  • Python滿天星代碼:讓編程變得更加簡單

    本文將從多個方面詳細闡述Python滿天星代碼,為大家介紹它的優點以及如何在編程中使用。無論是剛剛接觸編程還是資深程序員,都能從中獲得一定的收穫。 一、簡介 Python滿天星代碼…

    編程 2025-04-29
  • Python海龜代碼簡單畫圖

    本文將介紹如何使用Python的海龜庫進行簡單畫圖,並提供相關示例代碼。 一、基礎用法 使用Python的海龜庫,我們可以控制一個小海龜在窗口中移動,並利用它的「畫筆」在窗口中繪製…

    編程 2025-04-29
  • Python櫻花樹代碼簡單

    本文將對Python櫻花樹代碼進行詳細的闡述和講解,幫助讀者更好地理解該代碼的實現方法。 一、簡介 櫻花樹是一種圖形效果,它的實現方法比較簡單。Python中可以通過turtle這…

    編程 2025-04-28
  • Python大神作品:讓編程變得更加簡單

    Python作為一種高級的解釋性編程語言,一直被廣泛地運用於各個領域,從Web開發、遊戲開發到人工智慧,Python都扮演著重要的角色。Python的代碼簡潔明了,易於閱讀和維護,…

    編程 2025-04-28
  • 用Python實現簡單爬蟲程序

    在當今時代,互聯網上的信息量是爆炸式增長的,其中很多信息可以被利用。對於數據分析、數據挖掘或者其他一些需要大量數據的任務,我們可以使用爬蟲技術從各個網站獲取需要的信息。而Pytho…

    編程 2025-04-28
  • 如何製作一個簡單的換裝遊戲

    本文將從以下幾個方面,為大家介紹如何製作一個簡單的換裝遊戲: 1. 遊戲需求和界面設計 2. 使用HTML、CSS和JavaScript開發遊戲 3. 實現遊戲的基本功能:拖拽交互…

    編程 2025-04-27
  • Guava Limiter——限流器的簡單易用

    本文將從多個維度對Guava Limiter進行詳細闡述,介紹其定義、使用方法、工作原理和案例應用等方面,並給出完整的代碼示例,希望能夠幫助讀者更好地了解和使用該庫。 一、定義 G…

    編程 2025-04-27
  • 製作一個簡單的管理系統的成本及實現

    想要製作一個簡單的管理系統,需要進行技術選型、開發、測試等過程,那麼這個過程會花費多少錢呢?我們將從多個方面來闡述製作一個簡單的管理系統的成本及實現。 一、技術選型 當我們開始思考…

    編程 2025-04-27
  • 2的32次方-1:一個看似簡單卻又複雜的數字

    對於計算機領域的人來說,2的32次方-1(也就是十進位下的4294967295)這個數字並不陌生。它經常被用來表示IPv4地址或者無符號32位整數的最大值。但實際上,這個數字卻包含…

    編程 2025-04-27

發表回復

登錄後才能評論