如何使用 Node JS 将对象数组中对象的属性插入到 SQLServer 中?
How can I insert attributes of an object from an array of objects into SQLServer using Node JS?
几分钟前我做了一个 我可以解决但现在我的代码遇到了另一个问题,我有一个对象数组 lstValid[]
我需要每个对象是插入到 table(使用 SP)中,我想出了一种让它阅读文档的方法,但它不起作用,也许这只是一个愚蠢的错误,但我不知道如何解决,我的错误是
TypeError: Cannot read properties of undefined (reading 'Id_Oficina')
如你所见,它执行了我的 SP 但是它说属性 Id_Oficina
未定义,你知道为什么未定义吗?为什么它读取数组而不是属性?
这是我创建对象并将它们插入数组的函数:
async function calcWeather() {
const info = await fetch("../json/data.json")
.then(function (response) {
return response.json();
});
for (var i in info) {
const _idOficina = info[i][0].IdOficina;
const lat = info[i][0].latjson;
const long = info[i][0].lonjson;
const base = `https://api.openweathermap.org/data/2.5/weather?lat=${lat}&lon=${long}&appid=${api_key}&units=metric&lang=sp`;
fetch(base)
.then((responses) => {
return responses.json();
})
.then((data) => {
var 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,
};
// validation and saving data to array
if (myObject.Temperatura < 99)
lstValid.push(myObject);
});
}
}
这是我插入数据库的函数:
import { Request } from "tedious";
import { TYPES } from "tedious";
function executeStatement() {
calcWeather();
for (var m = 0; m >= lstValid.length; m++) {
const request = 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);
}
}
);
request.addParameter("IdOficina", TYPES.SmallInt, lstValid[m].Id_Oficina);
request.addParameter("Humedad", TYPES.SmallInt, lstValid[m].Humedad);
request.addParameter("Nubes", TYPES.SmallInt, lstValid[m].Nubes);
request.addParameter("Sensacion", TYPES.Float, lstValid[m].Sensacion);
request.addParameter("Temperatura", TYPES.Float, lstValid[m].Temperatura);
request.addParameter("Descripcion", TYPES.VarChar, lstValid[m].Descripcion);
request.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(request); // connection.execSql(RequestB);??
}
request.on("requestCompleted", function (rowCount, more) {
connection.close();
});
}
我也试过用这种方式发送它们,但也不起作用:
request.addParameter("IdOficina", TYPES.SmallInt, lstValid[m].myObject.Id_Oficina);
这个问题似乎是
行的条件不好
for (var m = 0; m >= lstValid.length; m++) {
此循环用 0 初始化 m
并在它大于或等于 lstValid
具有的元素数时递增它。由于 Javascript 是一种索引为 0 的语言,因此 lstValid.length
始终是无效索引。有效索引满足此公式
0 <= 有效索引 < lstValid.length
由于你的条件检查索引是否无效,然后才迭代循环,如果 lstValid
为空,它会在第一次迭代时出错,并且在 lstValid
时根本不会执行不为空。
修复
for (var m = 0; m < lstValid.length; m++) {
说明
您的错误来自于 lstValid.length
为 0,m
为 0 并且您的代码试图处理空数组第一个元素的成员字段。由于特定情况下没有第一个元素,因此出错。
几分钟前我做了一个 lstValid[]
我需要每个对象是插入到 table(使用 SP)中,我想出了一种让它阅读文档的方法,但它不起作用,也许这只是一个愚蠢的错误,但我不知道如何解决,我的错误是
TypeError: Cannot read properties of undefined (reading 'Id_Oficina')
如你所见,它执行了我的 SP 但是它说属性 Id_Oficina
未定义,你知道为什么未定义吗?为什么它读取数组而不是属性?
这是我创建对象并将它们插入数组的函数:
async function calcWeather() {
const info = await fetch("../json/data.json")
.then(function (response) {
return response.json();
});
for (var i in info) {
const _idOficina = info[i][0].IdOficina;
const lat = info[i][0].latjson;
const long = info[i][0].lonjson;
const base = `https://api.openweathermap.org/data/2.5/weather?lat=${lat}&lon=${long}&appid=${api_key}&units=metric&lang=sp`;
fetch(base)
.then((responses) => {
return responses.json();
})
.then((data) => {
var 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,
};
// validation and saving data to array
if (myObject.Temperatura < 99)
lstValid.push(myObject);
});
}
}
这是我插入数据库的函数:
import { Request } from "tedious";
import { TYPES } from "tedious";
function executeStatement() {
calcWeather();
for (var m = 0; m >= lstValid.length; m++) {
const request = 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);
}
}
);
request.addParameter("IdOficina", TYPES.SmallInt, lstValid[m].Id_Oficina);
request.addParameter("Humedad", TYPES.SmallInt, lstValid[m].Humedad);
request.addParameter("Nubes", TYPES.SmallInt, lstValid[m].Nubes);
request.addParameter("Sensacion", TYPES.Float, lstValid[m].Sensacion);
request.addParameter("Temperatura", TYPES.Float, lstValid[m].Temperatura);
request.addParameter("Descripcion", TYPES.VarChar, lstValid[m].Descripcion);
request.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(request); // connection.execSql(RequestB);??
}
request.on("requestCompleted", function (rowCount, more) {
connection.close();
});
}
我也试过用这种方式发送它们,但也不起作用:
request.addParameter("IdOficina", TYPES.SmallInt, lstValid[m].myObject.Id_Oficina);
这个问题似乎是
行的条件不好for (var m = 0; m >= lstValid.length; m++) {
此循环用 0 初始化 m
并在它大于或等于 lstValid
具有的元素数时递增它。由于 Javascript 是一种索引为 0 的语言,因此 lstValid.length
始终是无效索引。有效索引满足此公式
0 <= 有效索引 < lstValid.length
由于你的条件检查索引是否无效,然后才迭代循环,如果 lstValid
为空,它会在第一次迭代时出错,并且在 lstValid
时根本不会执行不为空。
修复
for (var m = 0; m < lstValid.length; m++) {
说明
您的错误来自于 lstValid.length
为 0,m
为 0 并且您的代码试图处理空数组第一个元素的成员字段。由于特定情况下没有第一个元素,因此出错。