我正在尝试使用node js和graphql在shopify中添加带有rest api的curl产品。存在与产品描述部分相关的问题。
Graphql 查询 const { 解码 } = require('html-entities'); 静态create_simple_product(数据){
let decoded_desc = decode(data.body_html);
const prodQuery = `
mutation {
productCreate(
input: {
title: "${data.title}",
productType: "${data.product_type}",
vendor: "${data.vendor}",
status:${statusData},
bodyHtml: "${decoded_desc.replace(/"/g, '\\"')}",
tags:"${typeof data.tags !== 'object' ? "" : data.tags}",
handle:"${data.handle}",
seo: {description: "${data.seo_description}", title: "${data.seo_title}"},
published:true
}
media: {originalSource: "${data.images[0]}", mediaContentType: IMAGE, alt: "${data.title}"}
) {
product {
id
title
bodyHtml
description
vendor
productType
createdAt
updatedAt
handle
status
totalInventory
totalVariants
tracksInventory
variants(first: 50) {
nodes {
id
inventoryItem {
id
}
title
price
compareAtPrice
createdAt
updatedAt
sku
barcode
weight
weightUnit
inventoryQuantity
inventoryManagement
position
image {
src
id
altText
}
}
}
options(first: 50) {
id
name
position
optionValues {
name
hasVariants
id
}
}
images(first: 100, sortKey: POSITION) {
edges {
node {
id
src
altText
height
width
}
}
}
media(first: 100) {
edges {
node {
id
... on MediaImage {
id
image {
src
}
}
}
}
}
}
userErrors {
field
message
}
}
}
`;
return prodQuery;
}
我从 php 发送的 api 主体。
$output_desc_prod = preg_replace('/<([^>]+)(\sstyle=(?P<stq>["\'])(.*)\k<stq>)([^<]*)>/iUs', '<$1$5>', $get_product_data->descriere_produs);
$product_description = htmlentities($output_desc_prod);
$data_sf_prod = array(
"api_key" => $site_data->api_key,
"server_key" => $site_data->server_key,
"title" => $get_product_data->nume_produs,
"body_html" => $product_description,
"vendor" => strtolower($site_data->den_site),
"status" => "draft",
"product_type" => "",
"tags" => "",
"images" => $array_images_final,
"seo_description" => $getMetaData->md,
"seo_title" => $getMetaData->mt,
"price" => $priceSelector,
"sku" => $get_product_data->cod_produs,
"handle"=> $get_product_data->slug_produs,
"barcode" => $get_product_data->ean === "" ? null : $get_product_data->ean,
"weight" => 1,
"weight_unit" => "",
"compare_at_price" => $priceCompareSelector
);
我使用htmlentities来消除任何问题,大多数情况下它可以工作,但是有些产品一旦插入就无法工作并显示以下错误。 创建简单的 ProductError:语法错误,[9, 25] 处出现意外的无效标记 (""")
这不一定是您所问问题的答案,但它可能会解决您的问题。请不要对 GraphQL 操作进行字符串插值。您应该将
query
和 variables
传递到后端。 query
将使用 GraphQL 变量引用,并且 variables
将是包含内容的 JSON 对象。
这有几个好处,包括:
您的
query
:
mutation CreateAProduct($productInput: ProductCreateInput!, $mediaInput: MediaCreateInput!) {
productCreate(
input: $productInput
media: $mediaInput
) {
# Whatever you want, or
# ...thisCouldBeAFragment
}
你的
variables
const variables = {
productInput: {
title: data.title,
productType: data.product_type,
vendor: data.vendor,
status: statusData,
bodyHtml: data.description,
tags: typeof data.tags !== 'object' ? "" : data.tags,
handle: data.handle,
seo: {description: data.seo_description, title: data.seo_title},
published: true
},
mediaInput: {
originalSource: data.images[0],
mediaContentType: "IMAGE",
alt: data.title
}
};
请注意,我刚刚使用了
data.description
。由于 variables
将贯穿 JSON.stringify
,因此您不必“手动弄清楚自己”如何使其作为请求正文的一部分工作。