javascript - INVALID_REQUEST_ERROR - VERSION_MISMATCH - 对象版本与最新的数据库版本不匹配
问题描述
我正在尝试使用节点的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"}]}'
当我查找数据时,我看到一个版本属性,例如一个 square 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]
}
};
我仍然得到同样的错误——即使我使用从查询返回给我的同一个对象。
更新
以上更新是有效的 - 请参阅答案。
解决方案
似乎可以做到这一点的是直接从响应中获取我需要的对象并像编辑它一样responseObj.xxxxxxx = xxxxxxxx
- 而不是尝试使用{}
符号自己创建一个 - 然后将该对象作为必要的参数传递。此外,firebase deploy
有时似乎需要重新运行才能使更改真正生效。
似乎我也需要使用单独uspsertCatalogObject
上传ITEM
and ,而不是在'字段中包含 ,或者在数组中同时使用and ——这似乎也不起作用。ITEM_VARIATION
ITEM_VARITION
ITEM
variations
batchUpsertCatalogObject
ITEM
ITEM_VARIATION
batches
推荐阅读
- c# - 如何使用对象更新 KTA RunTimeField?
- xml - 我正在尝试将网站中的图表插入到我的谷歌表格文档中
- flutter - Flutter:浮动模态表
- video - 将视频上传到 api.videoindexer.ai 并提供回调 URL 时,回调正文消息为空
- sql - 合并两个表但删除某个列中的重复项
- python - 我们可以同时执行两个矩阵的外积吗?
- php - Wordpress 过滤器 - 获取用户名
- swift - Amplify Schema 抱怨,因为参数类型不是“列表”
? - revit-api - Revit插件模板2020
- javascript - 如何根据反应状态向数组添加复选框值?