有客户需求可以查看生产数据,而 CS 端的 Web 程序运行存在部分问题,Web 客户端只是显示生产数据,其他功能没有用到,因此为了可以快速开发以及更加方便的操作,减低客户成本,为此采用 node 直连数据库的方式来获取生产数据。
Vue3来快速设计生产看板,实时数据的获取利用 Node 服务器来直接与数据库打交道,选用官网推荐的 tedious
模块来获取连接。
大家都知道 Vue3 客户端项目是无法直接操作数据库的,因此需要利用 NodeJs 来搭建一个建议版本的服务器,快捷又便捷,果然技术都是为了业务而服务的。
我个人喜欢使用 nvm 来管理 Node.js ,因为它允许电脑拥有多个版本的 Node.js ,只需要使用 nvm use <version>
来切换版本就可以啦。
下载依赖包我个人喜欢使用 pnpm 来下载依赖包,使用 npm install -g pnpm
就可以全局使用 pnpm 命令了,尽管它前段时间服务器崩溃了一次,也不影响我对其的热爱。
选择一个空目录作为项目服务端的目录,或者直接把服务端和客户端放在同一个目录也可以,然后创建 Node 项目:
pnpm init
创建后,会生成一个 package.json
文件,在项目中安装 tedious
模块:
pnpm install tedious
创建连接之前,需要确保电脑有 SQL server 的驱动。
利用 Connection
类来配置 SQL 数据库连接:
const Connection = require('tedious').Connection;
const SqlConfig = {
// 数据库地址
server: '127.0.0.1',
authentication: {
type: 'default',
options: {
// 用户名
userName: 'sa',
// 密码
password: '123456'
}
},
options: {
encrypt: false,
// 数据库
database: 'test'
}
}
const connection = new Connection(SqlConfig);
接下来可以通过绑定事件后执行连接,从而通过连接事件来判断是否连接成功:
connection.on('connect', function(err) {
if (err) {
console.log('数据库连接失败!');
throw err;
}
// SQL 语句逻辑编写
console.log("Connected");
});
connection.connect();
利用 Request
来设置 SQL 语句请求,在通过 row
和 requestCompleted
两个事件分别监控行数据和是否执行完,最后通过 execSql
函数来执行 SQL 语句请求:
// 设置 SQL 语句请求
const request = new Request("SELECT * FROM tb_sn;", function (err) {
if (err) {
console.log(err);
res.status(500).json({ error: 'Internal Server Error' });
}
});
// 记录查询的数据
const result = [];
// 监控行数据
request.on('row', function (columns) {
let temp = {};
// 字段遍历获取字段名称和字段对应值
columns.forEach(function (column) {
temp[column.metadata.colName] = column.value;
});
result.push(temp);
});
// 监控 SQL 语句请求执行完
request.on("requestCompleted", function () {
console.log(result);
connection.close();
console.info('数据库连接关闭!');
});
// 执行 SQL 语句请求
connection.execSql(request);
server.js
node ./server.js
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);
connection.on('connect', function(err) {
console.log("Connected");
executeStatement();
});
connection.connect();
function executeStatement() {
// 设置 SQL 语句请求
const request = new Request("SELECT * FROM tb_sn;", function (err) {
if (err) {
console.log(err);
res.status(500).json({ error: 'Internal Server Error' });
}
});
// 记录查询的数据
const result = [];
// 监控行数据
request.on('row', function (columns) {
let temp = {};
// 字段遍历获取字段名称和字段对应值
columns.forEach(function (column) {
temp[column.metadata.colName] = column.value;
});
result.push(temp);
});
// 监控 SQL 语句请求执行完
request.on("requestCompleted", function () {
console.log(result);
connection.close();
console.info('数据库连接关闭!');
});
// 执行 SQL 语句请求
connection.execSql(request);
}
介绍完,如何进行数据库连接以后,接下来就是如何进行请求访问啦。
利用 Express
构建精简的 Web 应用程序功能,从而设置对外的数据请求接口。
pnpm install express
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 ${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());
相信前面两个示例你都正常运行了,那么接下来就是将两者结合起来。
const express = require('express');
const cors = require('cors');
const app= express();
const port = 3000;
app.use(cors());
// 数据库
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 获取请求参数
executeStatement(res, "SELECT * FROM tb_sn;");
});
// 动态执行 SQL 请求以获取实时数据
function executeStatement(res, sql) {
connection.on('connect', (err) => {
console.info('数据库连接成功!');
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 () {
// 将查询结果写入请求里面 自动返回页面
res.json(result);
connection.close();
console.info('查询完成!');
});
connection.execSql(request);
});
connection.connect();
}
app.listen(port, () => {
console.info(`服务器启动成功, 端口 ${port}`);
})