TypeScript调用mssql的pool.request报错request不存在于void类型如何解决
问题根因
报错property 'request' does not exists on type 'void'的核心原因是 poolPromise 的返回类型不固定:
- 数据库连接成功时,
poolPromise返回sql.ConnectionPool类型的连接池实例,可正常调用request方法 - 数据库连接失败时,你写的
catch代码块仅打印错误,没有抛出异常,此时poolPromise会返回undefined(TS推断为void类型),自然不存在request属性
TS无法确定await poolPromise的最终返回类型,因此抛出类型错误。
修复步骤
1. 修改db.ts中poolPromise的异常处理逻辑
不要吞掉连接错误,在catch块中主动抛出异常,同时给poolPromise加明确类型标注,保证返回类型固定为Promise<sql.ConnectionPool>:
import sql from 'mssql/msnodesqlv8' import dotenv from 'dotenv'; dotenv.config(); const config:sql.config = { user:process.env.SQL_USER, password: process.env.SQL_PASSWORD, database: process.env.SQL_DBNAME, server: process.env.SQL_URL!, port: +process.env.SQL_PORT!, options: { encrypt: false, }, } // 主动加类型标注,避免TS类型推断出错 const poolPromise: Promise<sql.ConnectionPool> = new sql.ConnectionPool(config) .connect() .then(pool => { console.log('Connected to MSSQL') return pool }) .catch(err => { console.log('Database Connection Failed! ', err) // 抛出错误,让后续await操作能捕获到异常,不会返回void throw err }) export { sql, poolPromise }
2. 在user.ts中补充导入声明
你当前的user.ts没有导入sql和poolPromise变量,直接调用会导致运行时报错,需要在文件顶部补充导入:
// 路径替换为你项目中db.ts的实际相对路径 import { sql, poolPromise } from './db' class UserDB { async login(username:string,password:string){ try { const pool = await poolPromise const result = await pool.request() .input('username', sql.NVarChar, username) .input('password', sql.NVarChar, password) .execute('pwr_loginTenant'); return result.recordsets; } catch (error) { console.log('services:user.ts login error',error); // 可选:抛出错误让上层调用方也能感知异常 // throw error } } } const userDB = new UserDB() // TS项目建议使用ES模块导出规范,替换原有module.exports export default userDB
可选优化
可以在初始化配置前加环境变量校验,避免因为环境变量缺失导致连接配置不合法:
// db.ts中定义config前加 const requiredEnv = ['SQL_USER', 'SQL_PASSWORD', 'SQL_DBNAME', 'SQL_URL', 'SQL_PORT'] const missingEnv = requiredEnv.filter(key => !process.env[key]) if (missingEnv.length) { throw new Error(`缺失必要的数据库环境变量:${missingEnv.join(',')}`) }
内容的提问来源于stack exchange,提问作者Limor Dryer
相关产品推荐
相关产品推荐

