node.js-连接SQLserver数据库

1.在自己的项目JS文件夹中建文件:config.js、mssql.js和server.js以及api文件夹下的user.js

2.在config.js中封装数据库信息

let app = {
  user: 'sa', //这里写你的数据库的用户名
  password: '',//这里写数据库的密码
  server: 'localhost',
  database: 'medicineSystem', // 数据库名字
  port: 1433, //端口号,默认1433
  options: {
    encrypt: false,  //加密,设置为true时会连接失败 Failed to connect to localhost:1433 - self signed certificate
    enableArithAbort: false
  },
  pool: {
    min: 0,
    max: 10,
    idleTimeoutMillis: 3000
  }
}

module.exports = app

3.在mssql.js中对sql语句的二次封装

//mssql.js
/**
 *sqlserver Model
 **/
const mssql = require("mssql");
const conf = require("./config.js");

const pool = new mssql.ConnectionPool(conf)
const poolConnect = pool.connect()

pool.on('error', err => {
  console.log('error: ', err)
})
/**
 * 自由查询
 * @param sql sql语句,例如: 'select * from news where id = @id'
 * @param params 参数,用来解释sql中的@*,例如: { id: id }
 * @param callBack 回调函数
 */
let querySql = async function (sql, params, callBack) {
  try {
    let ps = new mssql.PreparedStatement(await poolConnect);
    if (params != "") {
      for (let index in params) {
        if (typeof params[index] == "number") {
          ps.input(index, mssql.Int);
        } else if (typeof params[index] == "string") {
          ps.input(index, mssql.NVarChar);
        }
      }
    }
    ps.prepare(sql, function (err) {
      if (err)
        console.log(err);
      ps.execute(params, function (err, recordset) {
        callBack(err, recordset);
        ps.unprepare(function (err) {
          if (err)
            console.log(err);
        });
      });
    });
  } catch (e) {
    console.log(e)
  }
};

/**
 * 按条件和需求查询指定表
 * @param tableName 数据库表名,例:'news'
 * @param topNumber 只查询前几个数据,可为空,为空表示查询所有
 * @param whereSql 条件语句,例:'where id = @id'
 * @param params 参数,用来解释sql中的@*,例如: { id: id }
 * @param orderSql 排序语句,例:'order by created_date'
 * @param callBack 回调函数
 */
let select = async function (tableName, topNumber, whereSql, params, orderSql, callBack) {
  try {
    let ps = new mssql.PreparedStatement(await poolConnect);
    let sql = "select * from " + tableName + " ";
    if (topNumber != "") {
      sql = "select top(" + topNumber + ") * from " + tableName + " ";
    }
    sql += whereSql + " ";
    if (params != "") {
      for (let index in params) {
        if (typeof params[index] == "number") {
          ps.input(index, mssql.Int);
        } else if (typeof params[index] == "string") {
          ps.input(index, mssql.NVarChar);
        }
      }
    }
    sql += orderSql;
    console.log(sql);
    ps.prepare(sql, function (err) {
      if (err)
        console.log(err);
      ps.execute(params, function (err, recordset) {
        callBack(err, recordset);
        ps.unprepare(function (err) {
          if (err)
            console.log(err);
        });
      });
    });
  } catch (e) {
    console.log(e)
  }
};

/**
 * 查询指定表的所有数据
 * @param tableName 数据库表名
 * @param callBack 回调函数
 */
let selectAll = async function (tableName, callBack) {
  try {
    let ps = new mssql.PreparedStatement(await poolConnect);
    let sql = "select * from " + tableName + " ";
    ps.prepare(sql, function (err) {
      if (err)
        console.log(err);
      ps.execute("", function (err, recordset) {
        callBack(err, recordset);
        ps.unprepare(function (err) {
          if (err)
            console.log(err);
        });
      });
    });
  } catch (e) {
    console.log(e)
  }
};

/**
 * 添加字段到指定表
 * @param addObj 需要添加的对象字段,例:{ name: 'name', age: 20 }
 * @param tableName 数据库表名
 * @param callBack 回调函数
 */
let add = async function (addObj, tableName, callBack) {
  try {
    let ps = new mssql.PreparedStatement(await poolConnect);
    let sql = "insert into " + tableName + "(";
    if (addObj != "") {
      for (let index in addObj) {
        if (typeof addObj[index] == "number") {
          ps.input(index, mssql.Int);
        } else if (typeof addObj[index] == "string") {
          ps.input(index, mssql.NVarChar);
        }
        sql += index + ",";
      }
      sql = sql.substring(0, sql.length - 1) + ") values(";
      for (let index in addObj) {
        if (typeof addObj[index] == "number") {
          sql += addObj[index] + ",";
        } else if (typeof addObj[index] == "string") {
          sql += "'" + addObj[index] + "'" + ",";
        }
      }
    }
    sql = sql.substring(0, sql.length - 1) + ") SELECT @@IDENTITY id"; // 加上SELECT @@IDENTITY id才会返回id
    ps.prepare(sql, function (err) {
      if (err) console.log(err);
      ps.execute(addObj, function (err, recordset) {
        callBack(err, recordset);
        ps.unprepare(function (err) {
          if (err)
            console.log(err);
        });
      });
    });
  } catch (e) {
    console.log(e)
  }
};

/**
 * 更新指定表的数据
 * @param updateObj 需要更新的对象字段,例:{ name: 'name', age: 20 }
 * @param whereObj 需要更新的条件,例: { id: id }
 * @param tableName 数据库表名
 * @param callBack 回调函数
 */
let update = async function (updateObj, whereObj, tableName, callBack) {
  try {
    let ps = new mssql.PreparedStatement(await poolConnect);
    let sql = "update " + tableName + " set ";
    if (updateObj != "") {
      for (let index in updateObj) {
        if (typeof updateObj[index] == "number") {
          ps.input(index, mssql.Int);
          sql += index + "=" + updateObj[index] + ",";
        } else if (typeof updateObj[index] == "string") {
          ps.input(index, mssql.NVarChar);
          sql += index + "=" + "'" + updateObj[index] + "'" + ",";
        }
      }
    }
    sql = sql.substring(0, sql.length - 1) + " where ";
    if (whereObj != "") {
      for (let index in whereObj) {
        if (typeof whereObj[index] == "number") {
          ps.input(index, mssql.Int);
          sql += index + "=" + whereObj[index] + " and ";
        } else if (typeof whereObj[index] == "string") {
          ps.input(index, mssql.NVarChar);
          sql += index + "=" + "'" + whereObj[index] + "'" + " and ";
        }
      }
    }
    sql = sql.substring(0, sql.length - 5);
    ps.prepare(sql, function (err) {
      if (err)
        console.log(err);
      ps.execute(updateObj, function (err, recordset) {
        callBack(err, recordset);
        ps.unprepare(function (err) {
          if (err)
            console.log(err);
        });
      });
    });
  } catch (e) {
    console.log(e)
  }
};

/**
 * 删除指定表字段
 * @param whereSql 要删除字段的条件语句,例:'where id = @id'
 * @param params 参数,用来解释sql中的@*,例如: { id: id }
 * @param tableName 数据库表名
 * @param callBack 回调函数
 */
let del = async function (whereSql, params, tableName, callBack) {
  try {
    let ps = new mssql.PreparedStatement(await poolConnect);
    let sql = "delete from " + tableName + " ";
    if (params != "") {
      for (let index in params) {
        if (typeof params[index] == "number") {
          ps.input(index, mssql.Int);
        } else if (typeof params[index] == "string") {
          ps.input(index, mssql.NVarChar);
        }
      }
    }
    sql += whereSql;
    ps.prepare(sql, function (err) {
      if (err)
        console.log(err);
      ps.execute(params, function (err, recordset) {
        callBack(err, recordset);
        ps.unprepare(function (err) {
          if (err)
            console.log(err);
        });
      });
    });
  } catch (e) {
    console.log(e)
  }
};

exports.config = conf;
exports.del = del;
exports.select = select;
exports.update = update;
exports.querySql = querySql;
exports.selectAll = selectAll;
exports.add = add;

4.在api/user.js下写接口代码

//user.js
const express = require('express');
const db = require('../mssql.js');
const moment = require('moment');
const router = express.Router();

/* GET home page. */
router.get('/medicineList', function (req, res, next) {//查询某表下的全部数据
  db.selectAll('medicineList', function (err, result) {
    res.send(result.recordset)
  });
});
router.get('/medicineAssess', function (req, res, next) {
  db.selectAll('medicineAssess', function (err, result) {
    res.send(result.recordset)
  });
});
router.get('/medicineAsk', function (req, res, next) {
  db.selectAll('medicineAsk', function (err, result) {
    res.send(result.recordset)
  });
});
router.get('/diseaseList', function (req, res, next) {
  db.selectAll('diseaseList', function (err, result) {
    res.send(result.recordset)
  });
});
router.get('/diseaseMedicine', function (req, res, next) {
  db.selectAll('diseaseMedicine', function (err, result) {
    res.send(result.recordset)
  });
});
router.get('/user', function (req, res, next) {
  db.selectAll('user', function (err, result) {
    res.send(result.recordset)
  });
});
router.get('/admin', function (req, res, next) {
  db.selectAll('admin', function (err, result) {
    res.send(result.recordset)
  });
});
router.post('/delete', function (req, res, next) {//删除一条id对应的userInfo表的数据
  const { UserId } = req.body
  const id = UserId
  db.del("where id = @id", { id: id }, "userInfo", function (err, result) {
    console.log(result, 66);
    res.send('ok')
  });
});
router.post('/update/:id', function (req, res, next) {//更新一条对应id的userInfo表的数据
  var id = req.params.id;
  var content = req.body.content;
  db.update({ content: content }, { id: id }, "userInfo", function (err, result) {
    res.redirect('back');
  });
});

module.exports = router;

5.在server.js中配置启动文件

//1.导入模块
const express = require('express')

//2.创建服务器
let server = express()
server.use(express.urlencoded()) //中间件要写在启动文件里面

const cors = require('cors')
server.use(cors())

const user = require('./api/user.js')

server.use('/', user)

//3.开启服务器
server.listen(8002, () => {
  console.log('服务器已启动,在端口号8002')
})

6.启动服务器

cmd到server.js所在的目录下输入:

nodemon server.js

7.用postman测试接口

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/212443.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C# WPF上位机开发(绘图软件)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 本身c# wpf可以看成是生产力工具,它的意义在于可以快速根据业务的情况,把产品模型搭建出来。这一点不像c/c,需要…

Python容器——字典

Key——Value 键值对

Nacos源码解读04——服务发现

SpringBoot自动注入 项目启动的时候会通过自动注入的机制将 NacosDiscoveryClientConfiguration注入 当注入NacosDiscoveryClientConfiguration的时候会将DiscoveryClient一起注入Bean DiscoveryClient实现了SpringCloud的DiscoveryClient接口,重点是getInstances和…

观察者设计模式

package com.jmj.pattern.observer;/*抽象观察者类*/ public interface Observer {void update(String message);}package com.jmj.pattern.observer;/*** 抽象主题角色*/ public interface Subject {//添加观察者对象void attach(Observer observer);//删除订阅者void detach(…

Docker的常用基本命令(基础命令)

文章目录 1. Docker简介2. Docker环境安装Linux安装 3. 配置镜像加速4. Docker镜像常用命令列出镜像列表搜索镜像下载镜像查看镜像版本删除镜像构建镜像推送镜像 5. Docker容器常用命令新建并启动容器列出容器停止容器启动容器进入容器删除容器(慎用)查看…

AI创作ChatGPT源码+AI绘画(Midjourney绘画)+DALL-E3文生图+思维导图生成

一、AI创作系统 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统,支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美,可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI…

安装selenium+chrome详解

1、创建yaml文件 创建yaml文件,命名为:docker-compose-chrome.yaml,具体内容如下: version: "3.9" services:spiderdriver:image: selenium/standalone-chrome:114.0restart: alwayshostname: spiderdrivercontainer_name: spiderdriverdeploy:resources:limit…

为何全球电商都在拼“质价比”?

远在西雅图的希拉里,在著名的“黑色星期五”大促开始之前,她就已经准备好了一份购物清单。 然而,她发现身边的朋友们总是拉她组团购物。 在朋友和社交媒体的持续轰炸下,希拉里决定尝试一下这个让人贼上头的Temu。 最终&#xf…

4.OpenResty系列之Nginx负载均衡

1. 负载均衡配置 上篇文章中,代理仅仅指向一个服务器。但是,网站在实际运营过程中,大部分都是以集群的方式运行,这时需要使用负载均衡来分流。nginx 也可以实现简单的负载均衡功能。 假设这样一个应用场景:将应用部署…

鸿蒙绘制折线图基金走势图

鉴于鸿蒙下一代剥离aosp,对于小公司而言,要么用h5重构,要么等大厂完善工具、等华为出转换工具后跟进,用鸿蒙重新开发一套代码对于一般公司而言成本会大幅增加。但对于广大开发者来说,暂且不论未来鸿蒙发展如何&#xf…

在PyCharm中运行OpenCV

一、安装Anaconda配置python环境 这里选用清华大学开源软件镜像站:anaconda | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 下载的速度更快。 点击下载链接:Index of /anaconda/archive/ | 清华大学开源软件镜像站 | Tsin…

神经网络模型预训练

根据神经网络各个层的计算逻辑用程序实现相关的计算,主要是:前向传播计算、反向传播计算、损失计算、精确度计算等,并提供保存超参数到文件中。 # coding: utf-8 import sys, os sys.path.append(os.pardir) # 为了导入父目录的文件而进行的…

Redis对象

Redis根据基本数据结构构建了自己的一套对象系统。主要包括字符串对象、列表对象、哈希对象、集合对象和有序集合对象 同时不同的对象都有属于自己的一些特定的redis指令集,而且每种对象也包括多种编码类型,和实现方式。 Redis对象结构 struct redisOb…

SSM SpringBoot vue社团事务管理系统

SSM SpringBoot vue社团事务管理系统 系统功能 登录 个人中心 人员信息管理 考勤信息管理 空闲时间管理 现金日记账管理 经费预算管理 物品租借管理 会议信息管理 活动信息管理 项目任务管理 公告通知管理 物资信息管理 开发环境和技术 开发语言:Java 使用框架:…

华为1+x网络系统建设与运维(中级)-练习题2

一.设备命令 LSW1 [Huawei]sys LSW1 同理可得,给所有设备改名 二.VLAN LSW1 [LSW1]vlan ba 10 20 [LSW1]int g0/0/1 [LSW1-GigabitEthernet0/0/1]port link-type trunk [LSW1-GigabitEthernet0/0/1]port trunk allow-pass vlan 10 20 [LSW1-GigabitEthernet0/0/1]in…

【Casbin】一篇文章入门Casbin

Casbin Casbin模型基础(PERM)Policy定义Request定义MatchersEffect ACL模型RBAC模型Go语言实战使用前先下载casbin包新建一个Casbin enforcer判断是否能通过增加Policy删除Policy更新Policy获取Policy Casbin 权限管理在几乎每个系统中都是必备的模块。…

Spring Cloud Gateway与spring-cloud-circuitbreaker集成与理解

官方文档地址 本文以 spring-cloud2021版本为例子 spring-cloud-gateway文档地址: https://spring.io/projects/spring-cloud-gateway#overview spring-cloud-circuitbreaker文档地址: https://spring.io/projects/spring-cloud-circuitbreaker 两者…

【LeetCode:1423. 可获得的最大点数 | 滑动窗口】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

matlab 计算两点云之间的放缩倍数

目录 一、算法原理1、原理概述2、参考文献二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、算法原理 1、原理概述 放缩倍数即尺度参数,尺度参数可由2个公共点在不同坐标系下的距离之…

leetcode:225. 用队列实现栈

一、题目 链接:225. 用队列实现栈 - 力扣(LeetCode) 函数原型: typedef struct { } MyStack; MyStack* myStackCreate() void myStackPush(MyStack* obj, int x) int myStackPop(MyStack* obj) int myStackTop(MyStack* obj) …