Node.js 设置数组时缺少必需的值
我正在使用Prisma upsert,当我试图设置其中一个字段(即数组类型,特别是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
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)
}