设置数组时缺少必需的值

Posted

技术标签:

【中文标题】设置数组时缺少必需的值【英文标题】:Missing a required value when setting array 【发布时间】:2020-12-20 20:57:46 【问题描述】:

我正在使用 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)

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

【问题讨论】:

你可以试试temperature: set : [...] 而不是temperature: [...]吗?基本上移除 setset 本身的外部块。 @oneturkmen 感谢您的回复!在这种情况下,TS red 用以下Type 'number[]' has no properties in common with type 'nodeUpdatetemperatureInput'.ts(2559) 强调温度 嗯。也许将set 保留在update 字段中,但将其从create 字段中删除?看起来它试图创建一个带有字段 set 的新变量,但该字段不存在。 @oneturkmen 不幸的是,如果它从任一位置删除,它都不喜欢它。虽然温度本身是可选的。 【参考方案1】:

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

【讨论】:

以上是关于设置数组时缺少必需的值的主要内容,如果未能解决你的问题,请参考以下文章

SigningConfig“发布”缺少必需的属性“keyPassword”

Dynamics 365 在用工作流创建实体时,步骤一直提示缺少必需的属性

缺少必需的包裹? - 包括 libyaml

Cloudinary\Error:缺少必需的参数 - 文件

php 中 判断数组中是不是有值

执行 org.jetbrains.kotlin 时缺少必需的类