最近项目中要用到node写接口然后连接公司现有的sql.server数据库,再把执行结果返回给前端(还是我),因为之前一直做前端这块,后端这方面不是很懂,花了很长的时间终于研究出来了(还是太菜了,走了很多弯路),所以写个博客,一是复习巩固,二是给其他有需要的小伙伴一个参考,尽量少走弯路,废话不多说,直接上代码

1.首先在自己的数据库新建一张表,用于接下来的测试

 2.在自己的项目文件夹中建两个文件,config.js & mssql.js

3.封装数据库信息,config.js

//config.js
let app = {
    user: 'xxxxxx', //这里写你的数据库的用户名
    password: 'xxxxxx',//这里写数据库的密码
    server: 'localhost', 
    database: 'testDB', // 数据库名字
    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

4.对sql语句的二次封装 , mssql.js

//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;

5.接口代码,api/user.js

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

/* GET home page. */
router.get('/info', function (req, res, next) {
    db.selectAll('userInfo', function (err, result) {//查询所有userInfo表的数据
        res.send(result.recordset)
        // res.render('userInfo', { results: result.recordset, moment: moment });
    });
});
router.post('/delete', function (req, res, next) {//删除一条id对应的userInfo表的数据
    console.log(req.body, 77);
    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;

6.启动文件,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')
})

7.启动服务器

8.用postman测试接口

 

 数据成功返回~~~

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐