Отсутствует необходимое значение при установке массива

Я использую Prisma upsert и получаю сообщение об отсутствии требуемого значения, когда пытаюсь установить одно из полей, которое является типом массива, в частности numeric[].

Я использую Prisma версии 2.6.0

Данные попадают в базу данных для всех, кроме нескольких строк, и я получаю сообщение об ошибке, которое Prisma выдает в этих строках при выполнении upsert.

Ошибка, которую я получаю от prisma, связана с массивом, который я пытаюсь установить:

PrismaClientKnownRequestError: 
Invalid `prisma.node.upsert()` invocation in
/usr/development/project/dist/project-tsdx.cjs.development.js:604:46


  Missing a required value at `Mutation.upsertOnenode.create.nodeCreateInput.temperature.nodeCreatetemperatureInput.set`
    at PrismaClientFetcher.request (/usr/development/project/node_modules/@prisma/client/runtime/index.js:1:227598)
    at runMicrotasks (<anonymous>)
    at processTicksAndRejections (internal/process/task_queues.js:93:5)
    at async Promise.all (index 3366) {
  code: 'P2012',
  meta: {
    path: 'Mutation.upsertOnenode.create.nodeCreateInput.temperature.nodeCreatetemperatureInput.set'
  }
}

Объект, на котором возникает исключение, имеет следующие значения:

threw this node: 
Node {
  name: 'ahostname',
  state: 'NONE',
  cores: -1,
  busycpus: 0,
  queue: 'NONE',
  rack: 'NONE',
  jobs: '',
  temperature: [ -1 ],
  tempupdatetime: '1970-01-01T00:00:00.000Z',
  power: 0,
  powerupdatetime: '1970-01-01T00:00:00.000Z',
  uptime: 20,
  loadavg1: 0,
  loadavg5: 0.01,
  loadavg15: 0.05,
  cpuusage: 0.2,
  updatetime: '2020-09-01T17:29:02.000Z'
}

Моя схема для модели узла выглядит следующим образом:

model node {
  node            String   @id
  state           String
  cores           Int
  busycpus        Int
  queue           String
  rack            String
  jobs            String
  temperature     Float[]
  tempupdatetime  DateTime
  power           Float
  powerupdatetime DateTime
  uptime          Int
  loadavg1        Float
  loadavg5        Float
  loadavg15       Float
  cpuusage        Float
  updatetime      DateTime
}

Наконец, фактический код, который я использую для установки этого массива, приведен ниже:

import { PrismaClient } from '@prisma/client'
import { NodeStats } from '../sources/nodeStats'
const prisma = new PrismaClient()

export default async (nodes: NodeStats) => {
  const { timestamp, ...others } = nodes
  //@ts-ignore
  let currentNode
  const promises = Object.keys(others).map(async nodeName => {
    try {
      const node = nodes[nodeName]
      currentNode = node
      let { temperature, name, ...others } = node
      
      if (temperature.length === 1 && temperature[0] === 0){
        node.temperature = [-1]
        temperature = [-1]
      }

      // if(!temperature) console.log(currentNode)
      await prisma.node.upsert({
        create: { ...others, node: name, temperature: {set: [...temperature]}},
        where: { node: nodeName },
        update: { ...others, node: name, temperature: { set: [...temperature] } },
      })
    } catch (e) {
      console.error("threw this node:", currentNode)
       console.error(e)
    }
  })
  return Promise.all(promises)
}

Все Nodeу брошенных есть одна общая черта: их temperature ценность [0]. Я пытался изменить это на[-1]но это не остановило возникновение ошибки. Действительно озадачен тем, что здесь происходит, любые советы будут оценены.

1 ответ

Решение

Я написал несколько шутливых тестов, чтобы определить причину этого, и оказалось, что это было вызвано передачей [0, null]. После исправления набора данных проблема исчезла.

Другие вопросы по тегам