0

我正在使用 Prisma upsert 并在尝试设置其中一个字段时收到有关缺少所需值的错误,该字段是数组类型,特别是numeric[].

我正在使用 Prisma 版本 2.6.0

除了少数几行之外,所有数据都进入了数据库,并且在执行 upsert 时,Prisma 在这些行上抛出了一个错误。

我从 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'
}

我的 Node 模型架构如下:

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被抛出的 s 都有一个共同点,它们的temperature值是[0]. 我试图将其更改为,[-1]但这并没有阻止错误的发生。真的很困惑这里发生了什么,任何提示将不胜感激。

4

1 回答 1

0

我写了一些开玩笑的测试来确定造成这种情况的原因,结果证明这是由于传入[0, null]. 修复数据集后,这个问题就解决了。

于 2020-09-03T23:08:05.757 回答