weixin_47369825 2023-12-04 09:23 采纳率: 0%
浏览 20
已结题

express连接mssql,每条额外附加了语句

使用express连接mssql,为啥会每条请求额外附加了一条语句:
exec sp_executesql @statement=N'SELECT 1;'

像是测试连接成功用的,可是我找遍了自己的express工程逻辑都没找到有这么用的地方

img

  • 写回答

13条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2023-12-04 10:16
    关注
    获得0.60元问题酬金

    引自强大而免费的微信小程序:皆我百晓生

    1. 原因分析

    当使用express连接mssql时,每次请求都额外附加一条语句"exec sp_executesql @statement=N'SELECT 1;'"是由于mssql模块内部实现的机制所导致的。这是mssql模块为了测试数据库连接是否成功所添加的附加语句。

    2. mssql模块的工作原理

    mssql模块是Node.js中用于连接SQL Server数据库的模块。它通过发送SQL语句到数据库服务器来执行查询、插入、更新等操作。

    在每次请求时,mssql模块会首先发起一个测试连接的请求,在数据库服务器执行语句"SELECT 1;",如果执行成功,代表数据库连接正常,然后再执行实际的用户请求。这个测试连接的过程是mssql模块内部实现的,用户无法直接控制或修改。

    3. 如何避免额外的"SELECT 1;"语句

    如果你不希望每次请求都附加额外的测试连接语句,可以通过修改mssql模块的源代码来解决。

    你可以按照以下步骤进行操作:

    1. 找到你项目中使用的mssql模块的源代码文件,位置在node_modules/mssql/lib/base.js

    2. 在这个文件中,找到名为createConnectPromise的函数,这是用于创建连接的函数。

    3. 在这个函数中,找到以下代码块:

    // 发起测试连接的请求
    const testPromise = connection
      .request()
      .query('SELECT 1;')
      .catch(() => {});
    
    1. 注释掉这段代码,或者修改为自己想要的测试语句。

    2. 保存修改后的文件。

    注意:修改mssql模块源代码可能会导致与其他依赖模块的兼容性问题,建议在修改前备份源代码文件,并对修改进行测试和验证。

    4. 参考代码

    以下是一个使用express连接mssql的示例代码,你可以参考其中的实现方式:

    const express = require('express');
    const sql = require('mssql');
    
    const app = express();
    
    // 配置mssql连接
    const config = {
      user: 'your_username',
      password: 'your_password',
      server: 'server_name',
      database: 'database_name',
    };
    
    // 创建连接池
    const pool = new sql.ConnectionPool(config);
    
    // 中间件,用来处理每个请求前创建连接
    app.use((req, res, next) => {
      pool.connect().then(() => {
        next();
      }).catch((err) => {
        res.status(500).send('Database connection error');
      });
    });
    
    // 路由处理程序
    app.get('/users', (req, res) => {
      const request = new sql.Request(pool);
      
      // 执行查询操作
      request.query('SELECT * FROM users').then((result) => {
        res.json(result.recordset);
      }).catch((err) => {
        res.status(500).send('Database query error');
      });
    });
    
    // 启动服务器
    app.listen(3000, () => {
      console.log('Server is running on port 3000');
    });
    

    这个示例中,通过mssql模块创建了一个连接池pool,然后通过中间件在每个请求之前创建数据库连接。在请求处理程序中,使用创建的连接对象request执行查询操作。

    希望以上信息对您有帮助!如果需要进一步解释或有任何疑问,请随时提问。

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 12月12日
  • 赞助了问题酬金15元 12月4日
  • 创建了问题 12月4日