Получение необработанного отказа от обещания при использовании batchInsert от Knex, когда размер массива больше 3 - PullRequest
0 голосов
/ 17 июня 2020

У меня есть приложение express, и я использую Knex в качестве построителя строки запроса.

Когда я использую пакетную вставку с ожиданием массива из 1000+ объектов, я получаю сообщение об ошибке, если массив слишком длинный (я вставил точную ошибку ниже по вопросу)

если у меня 3 или меньше объектов в моем массиве testFields, данные вставляются в базу данных правильно, все больше 3, и я получаю сообщение об ошибке. Итак, я считаю, что по какой-то причине проблема заключается в количестве элементов в массиве.

Я изолировал проблему, записав данные для вставки и жестко закодировав их. Переменная testFields , которая используется в качестве данных в batchInsert, может быть найдена внизу этого вопроса.

Моя база данных размещается на Azure.

Моя текущая версия узла - v12.18.0.

Это мой пакет. json

{
  "name": "expressjs",
  "version": "0.0.0",
  "private": true,
  "scripts": {
    "start": "node ./bin/www",
    "dev": "nodemon ./bin/www"
  },
  "dependencies": {
    "@azure/identity": "^1.0.3",
    "@azure/keyvault-keys": "^4.0.4",
    "axios": "^0.19.2",
    "azure-keyvault": "^3.0.5",
    "cookie-parser": "^1.4.5",
    "cors": "^2.8.5",
    "debug": "~2.6.9",
    "express": "~4.16.1",
    "express-jwt": "^5.3.3",
    "express-jwt-authz": "^2.4.0",
    "express-ws": "^4.0.0",
    "http-errors": "~1.6.3",
    "jade": "~1.11.0",
    "jwks-rsa": "^1.8.0",
    "knex": "^0.20.15",
    "lodash": "^4.17.15",
    "morgan": "~1.9.1",
    "ms-rest-azure": "^3.0.0",
    "mssql": "^5.1.1",
    "qs": "^6.9.4",
    "socket.io": "^2.3.0",
    "tedious": "^6.7.0",
    "ws": "^7.3.0"
  }
}

Вот мой код из маршрута Express и запроса Knex.

const isolateProblem = (res) => {
  // need to get connection string from vault
  return getKnexWithConString
    .then((knex) => {
      return knex
        .batchInsert("Tasks", testFields)
        .returning("pk_Tasks")
        .then((result) => {
          res.send("okay");
          return result;
        })
        .catch((err) => {
          res.send("not okay 1");
          console.log("err", err);
        });
    })
    .catch((err) => {
      res.send("not okay");
      console.log("err2:", err);
    });
};

router.get("/", async (req, res) => {
  const data = await isolateProblem(res);
  console.log("data", data);
});

Это ошибка, которую я получаю, если размер моего массива превышает 3 объекта. Похоже, это предупреждение о необработанном обещании, исходящее от транзакции. js: 45: 38. Не уверен, что я делаю, чтобы вызвать это.

"(узел: 805) UnhandledPromiseRejectionWarning: TypeError: Невозможно назначить доступному только для чтения свойству 'originalError' объекта 'TransactionError: Запросы можно только делать в состоянии LoggedIn, а не в состоянии Final 'at ... node_modules / knex / lib / dialects / mssql / transaction. js: 45: 38 (node: 805) UnhandledPromiseRejectionWarning: необработанное отклонение обещания.

Эта ошибка возникла либо в результате выброса внутри функции asyn c без блока catch, либо из-за отклонения обещания, которое не было обработано с помощью .catch (). Чтобы завершить процесс узла при отклонении необработанного обещания, используйте флаг CLI --unhandled-rejections=strict (см. https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1) (node: 805) [DEP0018] DeprecationWarning: необработанные отклонения обещаний устарели. В будущем, отклонения обещаний, которые не были обработаны, прекратят действие Node.js процесс с ненулевым кодом выхода. "

Нижеприведенная переменная изменяет форму вставляемых объектов. Обратите внимание, я скрыл имена и значения полей из соображений конфиденциальности.

Кроме того, в этом массиве есть 4 элемента, поэтому он получит указанную выше ошибку. Если бы мне пришлось удалить любой из этих элементов, чтобы длина массива была равна 3, не было бы проблем со вставкой данных.

Спасибо за любую помощь, которую вы можете предоставить!

const testFields = [
  {
    SqlField1: "00000",
    SqlField2: "",
    SqlField3: null,
    SqlField4: null,
    SqlField5: "UUID",
    SqlField6: null,
    SqlField7: "",
    SqlField8: "",
    SqlField9: "UUID",
    SqlField10: "Name",
    SqlField11: "",
    SqlField12: "",
    SqlField13: "",
    SqlField14: "",
    SqlField15: true,
    SqlField16: true,
    SqlField17: "UUID",
    SqlField18: "status",
    SqlField19: null,
    SqlField20: null,
    SqlField21: "###",
    SqlField22: "###",
    SqlField23: "###",
    SqlField24: null,
    SqlField25: false,
    SqlField26: null,
    SqlField27: new Date(Date.now()),
    SqlField28: new Date(Date.now()),
    SqlField29: "userName",
    SqlField30: "userName",
  },
  {
    SqlField1: "00000",
    SqlField2: "",
    SqlField3: null,
    SqlField4: null,
    SqlField5: "UUID",
    SqlField6: null,
    SqlField7: "",
    SqlField8: "",
    SqlField9: "UUID",
    SqlField10: "Name",
    SqlField11: "",
    SqlField12: "",
    SqlField13: "",
    SqlField14: "",
    SqlField15: true,
    SqlField16: true,
    SqlField17: "UUID",
    SqlField18: "status",
    SqlField19: null,
    SqlField20: null,
    SqlField21: "###",
    SqlField22: "###",
    SqlField23: "###",
    SqlField24: null,
    SqlField25: false,
    SqlField26: null,
    SqlField27: new Date(Date.now()),
    SqlField28: new Date(Date.now()),
    SqlField29: "userName",
    SqlField30: "userName",
  },
  {
    SqlField1: "00000",
    SqlField2: "",
    SqlField3: null,
    SqlField4: null,
    SqlField5: "UUID",
    SqlField6: null,
    SqlField7: "",
    SqlField8: "",
    SqlField9: "UUID",
    SqlField10: "Name",
    SqlField11: "",
    SqlField12: "",
    SqlField13: "",
    SqlField14: "",
    SqlField15: true,
    SqlField16: true,
    SqlField17: "UUID",
    SqlField18: "status",
    SqlField19: null,
    SqlField20: null,
    SqlField21: "###",
    SqlField22: "###",
    SqlField23: "###",
    SqlField24: null,
    SqlField25: false,
    SqlField26: null,
    SqlField27: new Date(Date.now()),
    SqlField28: new Date(Date.now()),
    SqlField29: "userName",
    SqlField30: "userName",
  },
  {
    SqlField1: "00000",
    SqlField2: "",
    SqlField3: null,
    SqlField4: null,
    SqlField5: "UUID",
    SqlField6: null,
    SqlField7: "",
    SqlField8: "",
    SqlField9: "UUID",
    SqlField10: "Name",
    SqlField11: "",
    SqlField12: "",
    SqlField13: "",
    SqlField14: "",
    SqlField15: true,
    SqlField16: true,
    SqlField17: "UUID",
    SqlField18: "status",
    SqlField19: null,
    SqlField20: null,
    SqlField21: "###",
    SqlField22: "###",
    SqlField23: "###",
    SqlField24: null,
    SqlField25: false,
    SqlField26: null,
    SqlField27: new Date(Date.now()),
    SqlField28: new Date(Date.now()),
    SqlField29: "userName",
    SqlField30: "userName",
  },
]
...