通过 API 修改数据
Posted
技术标签:
【中文标题】通过 API 修改数据【英文标题】:Mutating data through API 【发布时间】:2020-02-20 09:04:30 【问题描述】:每次在 Copper(我的 CRM)中创建新潜在客户时,我都会使用 Zapier 创建 Monday.com 任务。问题是 Zapier 只允许将信息存储在 Monday.com 上的任务名称中。我创建了一个 webhook,它应该从 Monday.com 任务标题中解析出所需的数据,并根据需要更新列值。但是,我的代码目前没有这样做。创建任务但列未正确填充时,我没有收到任何错误。我不确定是什么问题。
代码如下:
const express = require('express')
const path = require('path')
const bodyParser = require('body-parser')
const PORT = process.env.PORT || 5000
const updateMultipleColumnValues = require("./updateMultipleColumnValue").updateMultipleColumnValue;
const app = express();
app.use( bodyParser.json());
app.use(bodyParser.urlencoded(extended: true));
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
app.post('/', (req, res) =>
console.log(req.body)
const boardId, pulseId = req.body.event
let parsedRecord = extractData(req.body.event.pulseName)
console.log(parsedRecord);
let newData =
"text0": parsedRecord.DURATION
;
let stringData = JSON.stringify(newData);
console.log(boardId);
console.log(pulseId);
console.log(stringData);
updateMultipleColumnValues(boardId, pulseId, stringData);
res.json(parsedRecord);
);
app.listen(PORT, () => console.log(`Listening on $ PORT `));
// console.log(extractData(targetStr, fields));
function extractData(str)
let fields = ['DATE', 'TIME', 'DURATION', 'TYPE'];
return str.split(/\s*\|\s*/).reduce((res, entry) =>
let dat = entry.split(/\s*:\s*/);
return fields.indexOf(dat[0]) > -1 ? Object.assign(res, [dat[0]]: dat[1] ) : res;
, );
这里是 updateMultipleColumnValue 文件:
const executeMondayQuery = require("./executeMondayQuery").executeMondayQuery;
const updateMultipleColumnValue = async (boardId, itemId, newData) =>
const updateColumnValueBody =
query: `mutation
change_multiple_column_values(
board_id: $boardId,
item_id: $itemId,
column_values: $newData
) id
`
;
await executeMondayQuery(updateColumnValueBody);
;
exports.updateMultipleColumnValue = updateMultipleColumnValue;
Monday.com 使用 graphQL
【问题讨论】:
【参考方案1】:编辑:我们将在下周发布一个新的 Copper 集成,所以如果你不想用 Zapier 重新创建它,你可以等待这个版本。
无论如何,在此实现中您可能需要解决两件事。
TL;DR 解决方案
您需要先转义您的字符串,然后再将其发送到突变中。这应该有效:
const updateColumnValueBody =
query: `mutation
change_multiple_column_values(
board_id: $boardId,
item_id: $itemId,
column_values: "$newData.replace(/"/g, '\\"')"
) id
`
;
关于 GraphQL 错误处理的一句话
我不确定executeMondayQuery
函数内部的逻辑是什么,但是如果在执行 GraphQL 突变期间发生解析错误,HTTP 响应本身仍然有 200 状态码。
响应正文将包含一个 errors
数组,描述负载中的所有语法错误。
在 GraphQL JSON 属性中转义字符串
在这种特定情况下,问题可能是您的newData
(最初是stringData
)没有转义,也没有用双引号括起来(表明它是一个字符串)。
在字符串插值之后,你的有效载荷看起来像这样:
mutation
change_multiple_column_values(
board_id: 12345678,
item_id: 87654321,
column_values: "text": "123"
) id
但change_multiple_column_values
的column_values
属性接受JSON 格式的字符串
所以你真正想要的是:
mutation
change_multiple_column_values(
board_id: 12345678,
item_id: 87654321,
column_values: "\"text\": \"123\""
) id
【讨论】:
以上是关于通过 API 修改数据的主要内容,如果未能解决你的问题,请参考以下文章
通过python封装zabbix-api批量修改模板中触发器名称
利用Fiddler修改请求信息通过Web API执行Dynamics 365操作(Action)实例
通过curl调用 k8s service api 无法修改 spec.port