【问题标题】:INVALID_REQUEST_ERROR - VERSION_MISMATCH - Object version does not match latest database versionINVALID_REQUEST_ERROR - VERSION_MISMATCH - 对象版本与最新的数据库版本不匹配
【发布时间】:2021-11-30 07:37:06
【问题描述】:

我正在尝试使用节点的 square-connect 包更新我的方形库存中的一些数据,如下所示:

我正在使用 firebase functions 函数,它在 firebase 数据库更新时执行代码(这就是 export.updateItem 的用途,这是执行的函数,并返回已更新数据的快照):

exports.updateItem = functions.firestore
    .document('items/{itemId}')
    .onUpdate((change, context) => {
        // Get an object representing the document
        // e.g. {'name': 'Marie', 'age': 66}
        const newValue = change.after.data();
        const previousValue = change.before.data();

        var params = {
            query: {
                exact_query: {
                    attribute_name: "sku",
                    attribute_value: newValue.barcode
                }
            }
        }

        api.searchCatalogObjects(params).then(function(data) {
            console.log('API called successfully in searchFor IDS. Returned data: ' + JSON.stringify(data));

            var dat = data;

            var variation = {
                type: "ITEM_VARIATION",
                id: dat.objects[0].id,
                present_at_all_locations: true,
                item_variation_data: {
                  item_id: dat.objects[0].item_variation_data.item_id,
                  name: "Regular",
                  pricing_type: "FIXED_PRICING",
                  price_money: {
                    amount: Number(newValue.price) * 100,
                    currency: "USD",
                  },
                  sku: newValue.barcode,
                  track_inventory: true
                }
            };

            var item = {
              type: 'ITEM',
              id: dat.objects[0].item_variation_data.item_id,
              item_data: {
                name: newValue.barcode,
                description: newValue.description,
                variations: [variation]
              }
            };

            const idempotencyKey = require('crypto').randomBytes(32).toString('hex');
            var body = {
              idempotency_key: idempotencyKey,
              batches: [{
                objects: [item]
              }]
            };


            api.batchUpsertCatalogObjects(body).then(function(data) {
                console.log('API called successfully in update from EditItem. Returned data: ' + JSON.stringify(data));

                if(newValue.quantity != previousValue.quantity) {

                    var res = data;
                    var variationId = res.objects[0].item_data.variations[0].id;

                    locationApi.listLocations().then(function(data) {
                      console.log('API called successfully in locationApi. Returned data: ' + JSON.stringify(data));

                        var dat = data;
                        var locationId = dat.locations[0].id; // String | The ID of the item's associated location.

                         // String | The ID of the variation to adjust inventory information for.

                        //var body = new SquareConnect.V1AdjustInventoryRequest(); // V1AdjustInventoryRequest | An object containing the fields to POST for the request.  See the corresponding object definition for field details.

                        var adjustBody = {
                            quantity_delta: Number(newValue.quantity) - Number(previousValue.quantity),
                            adjustment_type: 'MANUAL_ADJUST'
                        }

                        inventoryApi.adjustInventory(locationId, variationId, adjustBody).then(function(data) {
                          console.log('API called successfully in inventoryApi. Returned data: ' + JSON.stringify(data));
                        }, function(error) {
                          console.error(error);
                        });
                    }, function(error) {
                      console.error(error);
                    });
                }
            }, function(error) {
              console.error(error);
            });

        }, function(error) {
          console.error(error);
        });

      return null;
    });

firebase 函数日志如下所示:

9:02:19.367 AM
updateItem
Function execution started
9:02:21.309 AM
updateItem
Function execution took 1944 ms, finished with status: 'ok'
9:02:31.834 AM
updateItem
API called successfully in searchFor IDS. Returned data: {"objects":[{"type":"ITEM_VARIATION","id":"6WNRO7PULPW7Z4QL73FEVITU","updated_at":"2018-08-14T00:53:50.645Z","version":1534208030645,"is_deleted":false,"present_at_all_locations":true,"item_variation_data":{"item_id":"SUW2HSXCNSERMTGERY4Y54TD","name":"Regular","sku":"0637792505002","ordinal":0,"pricing_type":"FIXED_PRICING","price_money":{"amount":100,"currency":"USD"},"location_overrides":[{"location_id":"JN6S37JH6M1Z2","track_inventory":true}],"track_inventory":true}}]}
9:02:47.035 AM
updateItem
 { Error: Bad Request
    at Request.callback (/user_code/node_modules/square-connect/node_modules/superagent/lib/node/index.js:675:11)
    at /user_code/node_modules/square-connect/node_modules/superagent/lib/node/index.js:883:18
    at Stream.<anonymous> (/user_code/node_modules/square-connect/node_modules/superagent/lib/node/parsers/json.js:16:7)
    at emitNone (events.js:86:13)
    at Stream.emit (events.js:185:7)
    at Unzip.<anonymous> (/user_code/node_modules/square-connect/node_modules/superagent/lib/node/unzip.js:53:12)
    at emitNone (events.js:91:20)
    at Unzip.emit (events.js:185:7)
    at endReadableNT (_stream_readable.js:974:12)
    at _combinedTickCallback (internal/process/next_tick.js:80:11)
  status: 400,
  response: 
   Response {
     domain: null,
     _events: {},
     _eventsCount: 0,
     _maxListeners: undefined,
     res: 
      IncomingMessage {
        _readableState: [Object],
        readable: false,
        domain: null,
        _events: [Object],
        _eventsCount: 3,
        _maxListeners: undefined,
        socket: [Object],
        connection: [Object],
        httpVersionMajor: 1,
        httpVersionMinor: 1,
        httpVersion: '1.1',
        complete: true,
        headers: [Object],
        rawHeaders: [Object],
        trailers: {},
        rawTrailers: [],
        upgrade: false,
        url: '',
        method: null,
        statusCode: 400,
        statusMessage: 'Bad Request',
        client: [Object],
        _consuming: true,
        _dumped: false,
        req: [Object],
        setEncoding: [Function],
        on: [Function],
        text: '{"errors":[{"category":"INVALID_REQUEST_ERROR","code":"VERSION_MISMATCH","detail":"Object version does not match latest database version.","field":"version"}]}',
        read: [Function] },
     request: 
      Request {
        domain: null,
        _events: {},
        _eventsCount: 0,
        _maxListeners: undefined,
        _agent: false,
        _formData: null,
        method: 'POST',
        url: 'https://connect.squareup.com/v2/catalog/batch-upsert',
        _header: [Object],
        header: [Object],
        writable: true,
        _redirects: 0,
        _maxRedirects: 5,
        cookies: '',
        qs: {},
        qsRaw: [],
        _redirectList: [],
        _streamRequest: false,
        _timeout: 60000,
        _responseTimeout: 0,
        _data: [Object],
        req: [Object],
        protocol: 'https:',
        host: 'connect.squareup.com',
        _endCalled: true,
        _callback: [Function],
        res: [Object],
        response: [Circular],
        called: true },
     req: 
      ClientRequest {
        domain: null,
        _events: [Object],
        _eventsCount: 3,
        _maxListeners: undefined,
        output: [],
        outputEncodings: [],
        outputCallbacks: [],
        outputSize: 0,
        writable: true,
        _last: true,
        upgrading: false,
        chunkedEncoding: false,
        shouldKeepAlive: false,
        useChunkedEncodingByDefault: true,
        sendDate: false,
        _removedHeader: [Object],
        _contentLength: 526,
        _hasBody: true,
        _trailer: '',
        finished: true,
        _headerSent: true,
        socket: [Object],
        connection: [Object],
        _header: 'POST /v2/catalog/batch-upsert HTTP/1.1\r\nHost: connect.squareup.com\r\nAccept-Encoding: gzip, deflate\r\nUser-Agent: Square-Connect-Javascript/2.20180712.1\r\nAuthorization: Bearer sq0atp-on5KcHDr0dhlbefU0EwVwg\r\nSquare-Version: 2018-07-12\r\nContent-Type: application/json\r\nAccept: application/json\r\nContent-Length: 526\r\nConnection: close\r\n\r\n',
        _headers: [Object],
        _headerNames: [Object],
        _onPendingData: null,
        agent: [Object],
        socketPath: undefined,
        timeout: undefined,
        method: 'POST',
        path: '/v2/catalog/batch-upsert',
        _ended: true,
        parser: null,
        res: [Object] },
     text: '{"errors":[{"category":"INVALID_REQUEST_ERROR","code":"VERSION_MISMATCH","detail":"Object version does not match latest database version.","field":"version"}]}',
     body: { errors: [Object] },
     files: undefined,
     buffered: true,
     headers: 
      { 'content-encoding': 'gzip',
        'content-type': 'application/json',
        'square-version': '2018-07-12',
        vary: 'Origin, Accept-Encoding',
        'x-content-type-options': 'nosniff',
        'x-download-options': 'noopen',
        'x-frame-options': 'SAMEORIGIN',
        'x-permitted-cross-domain-policies': 'none',
        'x-xss-protection': '1; mode=block',
        date: 'Tue, 14 Aug 2018 13:02:39 GMT',
        'keep-alive': 'timeout=60',
        'strict-transport-security': 'max-age=631152000',
        'content-length': '159',
        connection: 'close' },
     header: 
      { 'content-encoding': 'gzip',
        'content-type': 'application/json',
        'square-version': '2018-07-12',
        vary: 'Origin, Accept-Enco

Bad request 信息中,您可以看到错误在text 属性中:

text: '{"errors":[{"category":"INVALID_REQUEST_ERROR","code":"VERSION_MISMATCH","detail":"Object version does not match latest database version.","field":"version"}]}'

当我查找数据时,我看到一个版本属性,例如,一个正方形 ITEM_VARIATION,它看起来像:

"version":1534208030645

您可以在上面输出中此文本之后的对象中看到它:

在 searchFor IDS 中成功调用 API。返回数据:

它出现在我搜索ITEM_VARIATION 时返回的数据中。我已经尝试将此字段和值放入 batchUpsertCatalogObjects 请求中,但它似乎没有帮助 - 我相信我在尝试执行此操作时收到了另一个错误(我不记得它是什么,或者在正确的日志中找到它现在)。

任何帮助将不胜感激。

更新

我尝试将version: dat.objects[0].version 添加到item 对象,但没有帮助。

更新

我试过了:

var variationObj = dat.objects[0];

variationObj.item_variation_data.price_money =  {amount: Number(newValue.price) * 100, currency: 'USD'};

var item = {
              type: 'ITEM',
              id: dat.objects[0].item_variation_data.item_id,
              item_data: {
                name: newValue.barcode,
                description: newValue.description,
                variations: [variationObj]
           }
};

但我仍然遇到同样的错误 - 即使我使用从查询返回给我的完全相同的对象。

更新

以上更新有效 - 请参阅答案。

【问题讨论】:

  • 如何更新对象?您是否通过 API 检索它,然后更改返回对象中的字段?如果是这样 - 它应该已经有与之关联的版本,所以你不应该收到这个错误。
  • 我想我明白你在说什么,我现在正在尝试通过将响应变化项存储在一个变量中来实现你的建议,然后编辑 price_money 字段(我唯一需要编辑的字段)对于变化)直接在该变量上,以便价格发生变化。
  • @sjosey 看到我的更新...这是你的意思吗?
  • 我正在尝试自己更新 item_variation
  • 酷!如果你弄清楚了,请告诉我:)

标签: javascript firebase request square square-connect


【解决方案1】:

似乎有什么诀窍是直接从响应中获取我需要的对象并像responseObj.xxxxxxx = xxxxxxxx 那样编辑它——而不是尝试使用{} 表示法自己创建一个——然后将该对象作为必要的参数传递.此外,firebase deploy 似乎有时需要重新运行才能使更改真正生效。

似乎我还需要使用uspsertCatalogObject 分别上传ITEMITEM_VARIATION,而不是在ITEMvariations 字段中包含ITEM_VARITION,或者使用batchUpsertCatalogObject ITEMITEM_VARIATION 都包含在 batches 数组中 - 这似乎也不起作用。

【讨论】:

    【解决方案2】:

    根据 Square API 文档:

    Version => 对象的版本。更新对象时, 提供的版本必须与数据库中的版本相匹配,否则, write 会因为冲突而被拒绝。

    因此,当您获取对象时,您将拥有一个带有版本号的属性,您只需在更新目录对象时传递该值。 (在产品和变体中)

    这是使用版本字段更新产品目录的最简单 JSON 请求示例。

        "object": {
          "type": "ITEM",
          },
          "id": "7R55G27F2LHH2VUJ7ZONKWRA",
          "item_data": {
            "product_type": "REGULAR",
            "variations": [
              {
                "id": "GQTI2KPZHXNM33QJAJJLAGWC",
                "type": "ITEM_VARIATION",
                "item_data": {
                  "name": "cenas variant",
                  "product_type": "REGULAR"
                },
                "item_variation_data": {
                  "track_inventory": false,
                  "pricing_type": "FIXED_PRICING",
                  "price_money": {
                    "amount": 50,
                    "currency": "AUD"
                  }
                },
                "version": 1637854673484
              }
            ],
            "name": "UPDATE DE PRODUTO"
          },
          "version": 1637854673484
        },
        "idempotency_key": "ffe8498d-6313-45c8-b772-13c2dbc77b4b"
      }'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-17
      • 2017-08-03
      • 2018-04-17
      • 2011-10-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多