Node.js使用Tedious连接SQLServer报request.callback不是函数错误如何解决
问题修复方案
直接报错原因
你代码中调用connection.execSql时传入的是导入的Request类本身,而非你实例化的请求对象RequestB,类本身不存在callback方法,因此抛出TypeError: request.callback is not a function错误。
其他需要修复的逻辑问题
- 异步逻辑缺失等待:
calcWeather是异步函数,且内部包含多个异步fetch请求,你调用时未加await,执行数据库插入逻辑时lstValid数组还未完成数据填充,会出现访问空值报错 - 数组属性访问错误:你存入
lstValid的是直接myObject对象,不需要额外加.myObject层级访问属性 - 模块兼容问题:
package.json中配置type: commonjs,但代码用.mjs后缀+ESM的import语法,且你安装的node-fetch@3是纯ESM模块,和CommonJS规范不兼容 - 循环边界错误:数组下标从0开始,你写的
m <= 5会出现数组越界访问
修复后核心代码示例
// 首先修改package.json的type为module,或者将node-fetch降级到v2版本使用CommonJS语法 import { Connection, Request, TYPES } from "tedious"; import fetch from 'node-fetch'; import dotenv from 'dotenv'; dotenv.config(); var lstValid = []; var config = { // 保留你原有的连接配置 }; const api_key = process.env.apikey; // 改造calcWeather,确保所有异步请求完成后才返回 async function calcWeather() { const info = await fetch("../json/data.json").then(res => res.json()); // 用Promise.all等待所有接口请求完成 const fetchPromises = Object.values(info).map(async item => { const { IdOficina, latjson: lat, lonjson: long } = item[0]; const base = `https://api.openweathermap.org/data/2.5/weather?lat=${lat}&lon=${long}&appid=${api_key}&units=metric&lang=sp`; const data = await fetch(base).then(res => res.json()); const myObject = { Id_Oficina: IdOficina, Humedad: data.main.humidity, Nubes: data.clouds.all, Sensacion: data.main.feels_like, Temperatura: data.main.temp, Descripcion: data.weather[0].description, }; if (myObject.Temperatura < 99) { lstValid.push(myObject); } }) await Promise.all(fetchPromises); } async function executeStatement() { // 等待数据全部获取完成 await calcWeather(); // 遍历实际获取到的有效数据 for (let m = 0; m < lstValid.length; m++) { const currentItem = lstValid[m]; const RequestB = new Request( "EXEC USP_BI_CSL_insert_reg_RegistroTemperaturaXidOdicina @IdOficina, @Humedad, @Nubes, @Sensacion, @Temperatura, @Descripcion", function (err) { if (err) { console.log("Couldn't insert data: " + err); } } ); // 修正属性访问路径 RequestB.addParameter("IdOficina", TYPES.SmallInt, currentItem.Id_Oficina); RequestB.addParameter("Humedad", TYPES.SmallInt, currentItem.Humedad); RequestB.addParameter("Nubes", TYPES.SmallInt, currentItem.Nubes); RequestB.addParameter("Sensacion", TYPES.Float, currentItem.Sensacion); RequestB.addParameter("Temperatura", TYPES.Float, currentItem.Temperatura); RequestB.addParameter("Descripcion", TYPES.VarChar, currentItem.Descripcion); RequestB.on("row", function (columns) { columns.forEach(function (column) { if (column.value === null) { console.log("NULL"); } else { console.log("Product id of inserted item is " + column.value); } }); }); // 修正为传入实例化的请求对象 connection.execSql(RequestB); } } var connection = new Connection(config); connection.on("connect", function (err) { if (err) { console.log("Failed to connect!!! ", err); } else { console.log("Successful connection"); executeStatement(); } }); connection.connect();
内容的提问来源于stack exchange,提问作者Martín JF
相关产品推荐
相关产品推荐

