Node-mssql踩坑日志

1,190 阅读2分钟

关于nodejs用来连接sql server数据库的npm包node-mssql及其底层驱动tedious的踩坑日志。

1. 安装

由于我司开发环境在内网之中,全部npm包的安装都要经过一道代理。但实践证明,可能由于代理只配置到了npmjs,漏了些关键节点npm install mssql@latest 或者npm install mssql@7都会报错。

后经过实验,npm install mssql@6.3.2成功。

如果同样是在内网环境需要安装该包但由于未知玄学原因不成功的同学可以一试。

另外,由于mssql的底层驱动是tedious,目前是用不了安装Visual Stduio时顺带搞的localdb的!只能连正经SQL Server数据库。

2. 配置项

const sql = require("mssql");
let pool = new sql.ConnectionPool(dbConfig);

其中dbConfig形如:

let dbConfig={
    server:"localhost",
    database:"test",
    user:"sa",
    password:"123456",
    options:{
        encrypt:false,
        enableArithAbort:true
    }
}

Options:encrypt

在使用mssql这个包时我发现,如果options里面不设置encrypt:false易有ConnectionError: Failed to connect to localhost - Can not call write after a stream was destroyed的报错。

根据Stackoverflow上面的相关信息,当在使用本地部署SQL Server服务器时,需把encrypt配置项设置成false,不然就会报错。后来想了想,既然我的node程序跑在内网环境,我无论是连接本地的SQL Server还是连接服务器上的SQL Server都把encrypt设置成false,可以成功执行。

Options.enableArithAbort

Tedious的官网上,对于这个配置项的说明如下:

options.enableArithAbort: Ends a query when an overflow or divide-by-zero error occurs during query execution. See documentation for more details.

之所以要配置该项是因为在我使用mssql@6的过程中,它会一直弹一个warning要设置,为了眼不见心不烦,也就设了。这是由于该值的默认值在底层驱动Tedious的下个大版本更新(Major Version)中会从false转成true,所以使用时warning个没完没了。

3. 使用

虽然上文已经通过dbConfig创建了连接池,但是还没连接。

需要调用let poolConnect = pool.connect()来连接数据库。

同时,由于pool.connect()是异步方法,如果后续代码没有被包在then或者回调函数里面又或者有await的话,执行query等可能会报错ConnectionError: Connection is closed.

为了页面的美观,我选择await

即如:

async function newUser(){
    await poolConnect;
    let res = await new sql.Request(pool)
                .input("name",sql.NVarChar,"用户名")
                .input("pwd",sql.VarChar,"qwe12345")
                .query(`insert into user_info (username,password) values (@name,@pwd)`);
    ...
}

如上方例子,需要注意的是,在使用mssql.input来增加参数的时候,如有中文Type一定要用sql.NVarChar,不然哪怕是数据库里面的数据类型是Nvarchar,但是代码里面用了sql.VarChar,数据库里面最后插入的值也会是乱码。


按照我在mssql这个npm包上面踩坑的丰富经验,应该还有别的坑,但是一时之间没想起来,留待日后补充。