You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 18:45:03