Мутирование данных через API - PullRequest
0 голосов
/ 24 октября 2019

Я использую Zapier для создания задачи Monday.com каждый раз, когда в Copper (мой CRM) создается новое преимущество. Проблема в том, что 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 Ответ

1 голос
/ 13 ноября 2019

Редактировать: Мы выпустим новую интеграцию Copper на следующей неделе, так что, если вы не хотите создавать проблемы с ее воссозданием с помощью Zapier, вы можете подождать этого релиза.

В любом случае, естьэто две вещи, которые вы, вероятно, должны рассмотреть в этой реализации.

TL; DR Solution

Вам необходимо экранировать вашу строку перед отправкой в ​​мутации. Это должно работать:

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

Но атрибут column_values change_multiple_column_values принимает отформатированную в JSON строку

Итак, что вы на самом деле хотите:

mutation {
  change_multiple_column_values(
    board_id: 12345678,
    item_id: 87654321,
    column_values: "{\"text\": \"123\"}"
  ) { id }
}
...