前言
有客戶需求可以查看生產(chǎn)數(shù)據(jù),而 CS 端的 Web 程序運(yùn)行存在部分問題,Web 客戶端只是顯示生產(chǎn)數(shù)據(jù),其他功能沒有用到,因此為了可以快速開發(fā)以及更加方便的操作,減低客戶成本,為此采用 node 直連數(shù)據(jù)庫(kù)的方式來獲取生產(chǎn)數(shù)據(jù)。
基本思路
Vue3來快速設(shè)計(jì)生產(chǎn)看板,實(shí)時(shí)數(shù)據(jù)的獲取利用 Node 服務(wù)器來直接與數(shù)據(jù)庫(kù)打交道,選用官網(wǎng)推薦的 tedious
模塊來獲取連接。
部署服務(wù)端
大家都知道 Vue3 客戶端項(xiàng)目是無法直接操作數(shù)據(jù)庫(kù)的,因此需要利用 NodeJs 來搭建一個(gè)建議版本的服務(wù)器,快捷又便捷,果然技術(shù)都是為了業(yè)務(wù)而服務(wù)的。
先決條件
- Node.js
我個(gè)人喜歡使用 nvm 來管理 Node.js ,因?yàn)樗试S電腦擁有多個(gè)版本的 Node.js ,只需要使用 nvm use <version>
來切換版本就可以啦。
下載依賴包我個(gè)人喜歡使用 pnpm 來下載依賴包,使用 npm install -g pnpm
就可以全局使用 pnpm 命令了,盡管它前段時(shí)間服務(wù)器崩潰了一次,也不影響我對(duì)其的熱愛。
配置用于 Node.js 開發(fā)的開發(fā)環(huán)境
選擇一個(gè)空目錄作為項(xiàng)目服務(wù)端的目錄,或者直接把服務(wù)端和客戶端放在同一個(gè)目錄也可以,然后創(chuàng)建 Node 項(xiàng)目:
pnpm init
創(chuàng)建后,會(huì)生成一個(gè) package.json
文件,在項(xiàng)目中安裝 tedious
模塊:
pnpm install tedious
使用 Node.js 連接到 SQL 的概念證明
創(chuàng)建連接之前,需要確保電腦有 SQL server 的驅(qū)動(dòng)。
創(chuàng)建連接
利用 Connection
類來配置 SQL 數(shù)據(jù)庫(kù)連接:
const Connection = require('tedious').Connection;
const SqlConfig = {
// 數(shù)據(jù)庫(kù)地址
server: '127.0.0.1',
authentication: {
type: 'default',
options: {
// 用戶名
userName: 'sa',
// 密碼
password: '123456'
}
},
options: {
encrypt: false,
// 數(shù)據(jù)庫(kù)
database: 'test'
}
}
const connection = new Connection(SqlConfig);
執(zhí)行連接
接下來可以通過綁定事件后執(zhí)行連接,從而通過連接事件來判斷是否連接成功:
connection.on('connect', function(err) {
if (err) {
console.log('數(shù)據(jù)庫(kù)連接失敗!');
throw err;
}
// SQL 語(yǔ)句邏輯編寫
console.log("Connected");
});
connection.connect();
數(shù)據(jù)查詢
利用 Request
來設(shè)置 SQL 語(yǔ)句請(qǐng)求,在通過 row
和 requestCompleted
兩個(gè)事件分別監(jiān)控行數(shù)據(jù)和是否執(zhí)行完,最后通過 execSql
函數(shù)來執(zhí)行 SQL 語(yǔ)句請(qǐng)求:
// 設(shè)置 SQL 語(yǔ)句請(qǐng)求
const request = new Request("SELECT * FROM tb_sn;", function (err) {
if (err) {
console.log(err);
res.status(500).json({ error: 'Internal Server Error' });
}
});
// 記錄查詢的數(shù)據(jù)
const result = [];
// 監(jiān)控行數(shù)據(jù)
request.on('row', function (columns) {
let temp = {};
// 字段遍歷獲取字段名稱和字段對(duì)應(yīng)值
columns.forEach(function (column) {
temp[column.metadata.colName] = column.value;
});
result.push(temp);
});
// 監(jiān)控 SQL 語(yǔ)句請(qǐng)求執(zhí)行完
request.on("requestCompleted", function () {
console.log(result);
connection.close();
console.info('數(shù)據(jù)庫(kù)連接關(guān)閉!');
});
// 執(zhí)行 SQL 語(yǔ)句請(qǐng)求
connection.execSql(request);
完整代碼示例
server.js
node ./server.js
const SqlConfig = {
// 數(shù)據(jù)庫(kù)地址
server: '127.0.0.1',
authentication: {
type: 'default',
options: {
// 用戶名
userName: 'sa',
// 密碼
password: '123456'
}
},
options: {
encrypt: false,
// 數(shù)據(jù)庫(kù)
database: 'test'
}
}
const Connection = require('tedious').Connection;
const Request = require('tedious').Request;
const connection = new Connection(SqlConfig);
connection.on('connect', function(err) {
console.log("Connected");
executeStatement();
});
connection.connect();
function executeStatement() {
// 設(shè)置 SQL 語(yǔ)句請(qǐng)求
const request = new Request("SELECT * FROM tb_sn;", function (err) {
if (err) {
console.log(err);
res.status(500).json({ error: 'Internal Server Error' });
}
});
// 記錄查詢的數(shù)據(jù)
const result = [];
// 監(jiān)控行數(shù)據(jù)
request.on('row', function (columns) {
let temp = {};
// 字段遍歷獲取字段名稱和字段對(duì)應(yīng)值
columns.forEach(function (column) {
temp[column.metadata.colName] = column.value;
});
result.push(temp);
});
// 監(jiān)控 SQL 語(yǔ)句請(qǐng)求執(zhí)行完
request.on("requestCompleted", function () {
console.log(result);
connection.close();
console.info('數(shù)據(jù)庫(kù)連接關(guān)閉!');
});
// 執(zhí)行 SQL 語(yǔ)句請(qǐng)求
connection.execSql(request);
}
效果圖
配置 HTTP 服務(wù)
介紹完,如何進(jìn)行數(shù)據(jù)庫(kù)連接以后,接下來就是如何進(jìn)行請(qǐng)求訪問啦。
基本思路
利用 Express
構(gòu)建精簡(jiǎn)的 Web 應(yīng)用程序功能,從而設(shè)置對(duì)外的數(shù)據(jù)請(qǐng)求接口。
安裝 Express
pnpm install express
創(chuàng)建應(yīng)用
const express = require('express');
const app= express();
配置路由
app.get('/api/sn', (req, res) => {
res.send('Hello World!')
});
監(jiān)聽請(qǐng)求
app.listen(3000, () => {
console.log(`Example app listening on port ${port}`)
})
完整代碼示例
server.js
node ./server.js
const express = require('express');
const app = express();
app.get('/api/sn', (req, res) => {
res.send('Hello World!')
});
app.listen(3000, () => {
console.log(`Example app listening on port 3000`)
})
效果圖
配置跨域
- 安裝依賴包
pnpm install cors
- 配置跨域
const cors = require('cors'); app.use(cors());
請(qǐng)求數(shù)據(jù)庫(kù)數(shù)據(jù)
相信前面兩個(gè)示例你都正常運(yùn)行了,那么接下來就是將兩者結(jié)合起來。文章來源:http://www.zghlxwxcb.cn/news/detail-828971.html
const express = require('express');
const cors = require('cors');
const app= express();
const port = 3000;
app.use(cors());
// 數(shù)據(jù)庫(kù)
const SqlConfig = {
server: '127.0.0.1',
authentication: {
type: 'default',
options: {
userName: 'sa',
password: '123456'
}
},
options: {
encrypt: false,
database: 'test'
}
}
const Connection = require('tedious').Connection;
const Request = require('tedious').Request;
const connection = new Connection(SqlConfig);
// 路由
app.get('/api/sn', (req, res) => {
// 可以使用 req.query 獲取請(qǐng)求參數(shù)
executeStatement(res, "SELECT * FROM tb_sn;");
});
// 動(dòng)態(tài)執(zhí)行 SQL 請(qǐng)求以獲取實(shí)時(shí)數(shù)據(jù)
function executeStatement(res, sql) {
connection.on('connect', (err) => {
console.info('數(shù)據(jù)庫(kù)連接成功!');
const request = new Request(sql, function (err) {});
const result = [];
request.on('error', function (err) {
connection.close();
res.status(500).json({ error: 'Internal Server Error' });
});
request.on('row', function (columns) {
let temp = {};
columns.forEach(function (column) {
temp[column.metadata.colName] = column.value;
});
result.push(temp);
});
request.on("requestCompleted", function () {
// 將查詢結(jié)果寫入請(qǐng)求里面 自動(dòng)返回頁(yè)面
res.json(result);
connection.close();
console.info('查詢完成!');
});
connection.execSql(request);
});
connection.connect();
}
app.listen(port, () => {
console.info(`服務(wù)器啟動(dòng)成功, 端口 ${port}`);
})
效果圖
文章來源地址http://www.zghlxwxcb.cn/news/detail-828971.html
參考資料
- NodeJS 連接 SQL server:https://learn.microsoft.com/zh-cn/sql/connect/node-js
- Express 中文網(wǎng):https://www.expressjs.com.cn/starter/hello-world.html
- expressjs/cors:https://github.com/expressjs/cors
到了這里,關(guān)于【SQL server】NodeJs 服務(wù)器連接數(shù)據(jù)庫(kù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!