簡體   English   中英

如何使用 Node JS 將對象數組中的 object 的屬性插入 SQLServer?

[英]How can I insert attributes of an object from an array of objects into SQLServer using Node JS?

幾分鍾前我提出了一個可以解決的問題,但現在我的代碼出現了另一個問題,我有一個對象數組lstValid[]並且我需要將每個 object 插入到表中(使用 SP),我雖然有一種方法可以讓它閱讀文檔,但它不起作用,也許這只是一個愚蠢的錯誤,但我不知道如何解決它,我的錯誤是

TypeError: Cannot read properties of undefined (reading 'Id_Oficina')

如您所見,它執行我的 SP 但它說屬性Id_Oficina未定義,您知道為什么未定義嗎? 為什么它讀取數組而不讀取屬性?

這是 function 我在其中創建對象並將它們插入到數組中:

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);
      });
  }
}

這是我插入數據庫的 function :

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++) {

此循環將m初始化為 0 並在它大於或等於lstValid具有的元素數時遞增它。 由於 Javascript 是 0 索引語言, lstValid.length始終是無效索引。 有效索引滿足這個公式

0 <= 有效索引 < lstValid.length

由於您的條件檢查索引是否無效,然后才迭代循環,因此如果lstValid為空,它將在第一次迭代時出錯,並且當lstValid不為空時它根本不會執行。

使固定

for (var m = 0; m < lstValid.length; m++) {

解釋

您的錯誤來自以下事實: lstValid.length為 0, m為 0,並且您的代碼試圖處理空數組的第一個元素的成員字段。 由於在特定情況下沒有第一個元素,所以它出錯了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM