修改问题
我已经修改了问题,希望能够得到更清晰的答案。
我正在尝试在ExpressJS中处理数据,基于传入的req.body
和表中的现有数据。
我收到一个包含更新字段JSON列表的req.body
。其中一些字段在Postgres中存储为JSONB。如果传入的字段是JSONB,则生成补丁列表的是发出请求的表单(外部代码)已经运行了jsonpatch.compare()
,并且传递的是这些补丁而不是完整值。对于任何非JSONB值,只需要将传入的值通过到UPDATE
查询。
我有一个正在工作的版本,如下所示,它假装表中的现有JSONB值为NULL。显然,这不是所需的。我需要从数据库中提取值。没有查询当前值的版本以及最低限度的路由器如下:
const express = require('express')
const bodyParser = require('body-parser')
const SQL = require('sql-template-strings')
const { Client } = require('pg')
const dbConfig = require('../db')
const jsonpatch = require('fast-json-patch')
const FormRouter = express.Router()
I have some update code:
````javascript
const patchFormsRoute = (req, res) => {
const client = new Client(dbConfig)
const { id } = req.body
const parts = []
const params = [id]
// list of JSONB fields for the 'forms' table
const jsonFields = [
'sections',
'editors',
'descriptions',
]
// list of all fields, including JSONB fields in the 'forms' table
const possibleFields = [
'status',
'version',
'detail',
'materials',
...jsonFields,
]
// this is a DUMMY RECORD instead of the result of a client.query
let currentRecord = { 'sections':[], 'editors':[], 'descriptions':[] }
possibleFields.forEach(myProp => {
if (req.body[myProp] != undefined) {
parts.push(`${myProp} = $${params.length + 1}`)
if (jsonFields.indexOf(myProp) > -1) {
val = currentRecord[myProp]
jsonpatch.applyPatch(val, req.body[myProp])
params.push(JSON.stringify(val))
} else {
params.push(req.body[myProp])
}
}
})
const updateQuery = 'UPDATE forms SET ' + parts.join(', ') + ' WHERE id = $1'
client.connect()
return client
.query(updateQuery, params)
.then(result => res.status(200).json(result.rowCount))
.catch(err => res.status(400).json(err.severity))
.then(() => client.end())
}
FormRouter.route('/')
.patch(bodyParser.json({ limit: '50mb' }), patchFormsRoute)
exports.FormRouter = FormRouter
我保证这是有效的代码,几乎实现了我需要的功能。但是,我想用从表格中同时获取的数据替换虚拟记录。我的问题在于,由于多个客户端可能同时更新一行(但是查看JSONB值时为正交元素),因此我需要将获取、计算和更新作为一个单一的事务进行。我的计划是:
- 开始一个事务
- 根据传入的
id
查询Postgres的当前行值 - 对于任何JSONB字段,应用补丁程序以生成UPDATE语句中该字段的正确值
- 使用适当的参数值运行UPDATE语句(根据字段是JSONB还是非JSONB,要么来自
req.body
,要么来自修补后的行) - 提交事务,或在出现错误时回滚
res
的组合使服务器进入了超空间......最终导致了超时。
then
? - user9201277