本文目錄一覽:
- 1、如何對nodejs代碼加密?國內,除了 jshaman 還有別的nodejs保護提供商嗎?
- 2、關於nodejs 怎麼實現 crypto des加密
- 3、nodejs怎麼後台操作mysql
- 4、nodejs線程池能分配多少線程
如何對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-hk/n/241898.html