Nodejs 操作 Sql Server

来源:https://www.cnblogs.com/weihanli/archive/2018/11/24/nodejs-sqlserver-operation.html
-Advertisement-
Play Games

Nodejs 操作 Sql Server Intro 最近項目需要爬取一些數據,數據有加密,前端的js又被混淆了,ajax請求被 hook 了,有些複雜,最後打算使用 puppeteer 來爬取數據。 Puppeteer 是谷歌團隊在維護的一個項目,初衷主要是用來做網頁的自動化測試, Google ...


Nodejs 操作 Sql Server

Intro

最近項目需要爬取一些數據,數據有加密,前端的js又被混淆了,ajax請求被 hook 了,有些複雜,最後打算使用 puppeteer 來爬取數據。

Puppeteer 是谷歌團隊在維護的一個項目,初衷主要是用來做網頁的自動化測試, Google Chrome 團隊官方的無界面(Headless)Chrome 工具,它是一個 Node 庫,提供了一個高級的 API 來控制 DevTools協議上的無頭版 Chrome ,也可以配置為使用完整(非無頭)的 Chrome。這裡就不詳細介紹了,有興趣的可以自己先行 Google 一下,之後再寫一篇文章來介紹,今天主要介紹 node 操作 mssql。

node-mssql

node-mssql 是我們用來操作 Ms Sql Server 資料庫用到的 npm 包,支持 promise, async/await 語法。這個包也是微軟官方推薦使用的。

個人比較喜歡 async/await 語法。

基本用法:

let pool = await sql.connect(config);
// sql
let result1 = await pool.request()
            .input('input_parameter', sql.Int, value)
            .query('select * from mytable where id = @input_parameter');

// 存儲過程
let result2 = await pool.request()
            .input('input_parameter', sql.Int, value)
            .output('output_parameter', sql.VarChar(50))
            .execute('procedure_name');

更多用法請參考官方文檔介紹 https://www.npmjs.com/package/mssql

封裝

雖然提供比較完善的方法,但是如果用起來的話還是會覺得用起來有些不舒服,沒有那麼流暢,沒有那麼簡潔,於是想自己封裝一層

const mssql = require("mssql");
const log4js = require("log4js");
const logger = log4js.getLogger("dbUtil");

const connConfig = {
    user: "db user",
    password: "password",
    server: "server",
    database: "database name",
    connectionTimeout: 120000,
    requestTimeout: 3000000,
    retryTimes: 3,
    options: {
        encrypt: true
    },
    pool: {
        max: 1024,
        min: 1,
        idleTimeoutMillis: 30000
    }
};

mssql.on('error', err => {
    // ... error handler
    logger.error(err);
});
let connectionPool;

var getConnection = async function(){//連接資料庫
    if(!(connectionPool && connectionPool.connected)) {
        connectionPool = await mssql.connect(connConfig);
    }
    return connectionPool;
}

var querySql = async function (sql, params) {//寫sql語句自由查詢
    await mssql.close();// close
    var pool = await getConnection();
    var request = pool.request();
    if (params) {
        for (var index in params) {
            if (typeof params[index] == "number") {
                request.input(index, mssql.Int, params[index]);
            } else if (typeof params[index] == "string") {
                request.input(index, mssql.NVarChar, params[index]);
            }
        }
    }
    var result = await request.query(sql);
    await mssql.close();// close
    return result;
};

var add = async function (addObj, tableName) {//添加數據
    if(!addObj){
        return;
    }    
    await mssql.close();// close
    var connection = await getConnection();
    var request = connection.request();

    var sql = "insert into " + tableName + "(";
    for (var index in addObj) {
        if (typeof addObj[index] == "number") {
            request.input(index, mssql.Int, addObj[index]);
        } else if (typeof addObj[index] == "string") {
            request.input(index, mssql.NVarChar, addObj[index]);
        }
        sql += index + ",";
    }
    sql = sql.substring(0, sql.length - 1) + ") values(";
    for (var index in addObj) {
        if (typeof addObj[index] == "number") {
            sql += "@" + index + ",";
        } else if (typeof addObj[index] == "string") {
            sql += "@" + index + ",";
        }
    }
    sql = sql.substring(0, sql.length - 1) + ")";

    var result = await request.query(sql);
    await mssql.close();// close
    return result;
};

var addIfNotExist = async function (addObj, whereObj, tableName) {//添加數據
    if(!addObj){
        return;
    }
    if(!whereObj){
        return await add(addObj, tableName);
    }
    await mssql.close();// close
    var connection = await getConnection();
    var request = connection.request();

    let sql = `BEGIN
    IF NOT EXISTS (SELECT 1 FROM ${tableName} WHERE 1 > 0`;

    for(var index in whereObj){
        if (typeof addObj[index] == "number") {
            request.input(index+'Where', mssql.Int, whereObj[index]);
        } else if (typeof addObj[index] == "string") {
            request.input(index+'Where', mssql.NVarChar, whereObj[index]);
        }
        sql += ` AND ${index} = @${index}Where`
    }
    sql+= ')';

    sql += 'BEGIN ';
    sql += "INSERT INTO " + tableName + "(";
    for (var index in addObj) {
        if (typeof addObj[index] == "number") {
            request.input(index, mssql.Int, addObj[index]);
        } else if (typeof addObj[index] == "string") {
            request.input(index, mssql.NVarChar, addObj[index]);
        }
        sql += index + ",";
    }
    sql = sql.substring(0, sql.length - 1) + ") values(";
    for (var index in addObj) {
        if (typeof addObj[index] == "number") {
            sql += "@" + index + ",";
        } else if (typeof addObj[index] == "string") {
            sql += "@" + index + ",";
        }
    }
    sql = sql.substring(0, sql.length - 1) + ")";

    sql += `   END
    END`;

    var result = await request.query(sql);
    await mssql.close();// close
    return result;
};


var addList = async function (addObjs, tableName) {//添加數據
    if(!addObjs || addObjs.length == 0){
        return;
    }
    await mssql.close();// close
    var connection = await getConnection();
    var sql = "INSERT INTO " + tableName + "(";
    if (addObjs) {
        let addObj = addObjs[0];
        for (var index in addObj) {
            sql += index + ",";
        }
        sql = sql.substring(0, sql.length - 1) + ") VALUES";
        addObjs.forEach(addObj => {
            sql = sql + "(";
            for (var index in addObj) {
                if (typeof addObj[index] == "number") {
                    sql += addObj[index] + ",";
                } else if (typeof addObj[index] == "string") {
                    sql += "N'" + addObj[index] + "'" + ",";
                }
            }
            sql = sql.substring(0, sql.length - 1) + "),";
        });
    }
    sql = sql.substring(0, sql.length - 1);
    // logger.info(sql);
    var result = await connection.request().query(sql);
    await mssql.close();// close
    return result;
};

var update = async function (updateObj, whereObj, tableName) {//更新數據
    await mssql.close();// close
    var connection = await getConnection();
    var request = connection.request();

    var sql = "UPDATE " + tableName + " SET ";
    if (updateObj) {
        for (var index in updateObj) {
            if (typeof updateObj[index] == "number") {
                request.input(index, mssql.Int, updateObj[index]);
                sql += index + "=@" + index + ",";
            } else if (typeof updateObj[index] == "string") {
                request.input(index, mssql.NVarChar, updateObj[index]);
                sql += index + "=@" + index + ",";
            }
        }
    }
    sql = sql.substring(0, sql.length - 1) + " WHERE ";
    if (whereObj) {
        for (var index in whereObj) {
            if (typeof whereObj[index] == "number") {
                request.input(index, mssql.Int, whereObj[index]);
                sql += index + "=@" + index + " AND ";
            } else if (typeof whereObj[index] == "string") {
                request.input(index, mssql.NVarChar, whereObj[index]);
                sql += index + "=@" + index + " AND ";
            }
        }
    }
    sql = sql.substring(0, sql.length - 5);
    var result = await request.query(sql);
    await mssql.close();// close
    return result;
};

exports.query = querySql;
exports.update = update;
exports.add = add;
exports.addIfNotExist = addIfNotExist;
exports.addList = addList;

Contact

Contact me: [email protected]


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 很多在外企工作的小伙伴可能遇到過這種情況,Windows系統是英文版的,打開中文的文檔或者運行中文的程式時,中文都變成了亂碼。 這是由於大部分中文程式所使用的文字編碼與英文系統的文字編碼不同造成的。只需要將Windows的語言格式及Unicode改成中文就可以了。 以下步驟最後會需要重啟電腦,請先將 ...
  • 在Win10系統里同時按下”Win+R“組合按鍵,在打開的運行對話框里輸入命令:msconfig,然後點擊確定,如下圖所示。 點擊打開系統配置視窗,選擇引導選項卡,如下圖所示。 在引導選項卡視窗下,將引導選項下的安全引導(F)勾中,然後點擊確定,如下圖所示。 點擊後,系統提示重新啟動後,會進入安全模 ...
  • 1 記憶體管理域zone 為了支持NUMA模型,也即CPU對不同記憶體單元的訪問時間可能不同,此時系統的物理記憶體被劃分為幾個節點(node), 一個node對應一個記憶體簇bank,即每個記憶體簇被認為是一個節點 首先, 記憶體被劃分為結點. 每個節點關聯到系統中的一個處理器, 內核中表示為 的實例. 系統中 ...
  • 大學生Linux常用命令(一) 1.1 命令格式 命令格式一般為 命令名 [選項] [參數1] [參數2]… 例如:cp I file1 cp為命令名, l為選項,file1為參數。 其中,命令名必須要有,選項和參數可有可無,具體按照要求來操作。 1.2輸入命令 LinuxUI一定要註意大小寫 如果 ...
  • Linux 文件或目錄的屬性主要包括:文件或目錄的節點、種類、許可權模式、鏈接數量、所歸屬的用戶和用戶組、最近訪問或修改的時間等內容。具體情況如下: 命令: ls lih 輸出: 忘記ls 命令參數的,可以參考: "linux每日命令(1):ls命令" 說明: 第一列:inode 第二列:文件種類和權 ...
  • 歷史命令查詢: history 查看使用過的命令 history -c 清空歷史命令 history -w 把緩存的命令寫入到文件中。文件在/root/.bash_history 註:輸出執行過的所有命令,不管對錯,如果需要重新執行某條命令,“!行號”可以再次執行。如!256,就執行了第256行的這 ...
  • Centos6 [root@Centos6 ~]$ hostname # 查看當前的hostnmae Centos6 [root@Centos6 ~]$ vim /etc/sysconfig/network # 編輯network文件修改hostname行(重啟生效) [root@Centos6 ~ ...
  • 1.MTR(mini-transaction) 在MySQL的 InnoDB日誌管理機制中,有一個很重要的概念就是MTR。MTR是InnoDB存儲擎中一個很重要的用來保證物理寫的完整性和持久性的機制。 先看下MTR在MysQL架構中的位置。 MTR是上面的邏輯層與下麵物理層的交互視窗,同時也是用來保 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...