Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 设置数组时缺少必需的值_Node.js_Postgresql_Prisma_Prisma2 - Fatal编程技术网

Node.js 设置数组时缺少必需的值

Node.js 设置数组时缺少必需的值,node.js,postgresql,prisma,prisma2,Node.js,Postgresql,Prisma,Prisma2,我正在使用Prisma upsert,当我试图设置其中一个字段(即数组类型,特别是numeric[])时,得到一个关于缺少所需值的错误 我使用的是Prisma 2.6.0版 除了少数几行之外,所有行的数据都进入了数据库,当upsert执行时,Prisma在这些行上抛出了一个错误 我从prisma得到的错误与我试图设置的阵列有关: PrismaClientKnownRequestError: Invalid `prisma.node.upsert()` invocation in /usr/de

我正在使用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'
  }
}
我的节点模型模式如下所示:

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

所有抛出的
节点
都有一个共同点,它们的
温度
值是
[0]
。我试图将其更改为
[-1]
,但这并没有阻止错误的发生。我对这里发生的事情感到非常困惑,任何提示都将不胜感激。

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

您可以尝试
温度:[…]而不是
温度:{set:[…]}
吗?基本上移除
set
周围的外部块和
set
本身。@oneturkmen感谢您的回复!在这种情况下,TS(2559)
Hmm。可以在
update
字段中保留
set
,但将其从
create
字段中删除?它似乎试图用字段
set
创建一个新变量,该字段不存在。@oneturkmen很遗憾,它不喜欢从任何位置删除它。尽管温度本身是可选的。
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)
}