我正在做一个将一些REST API迁移到GraphQL API的项目,我可以通过Axios发送查询中的数组吗?

我试图将数组转换为对象,并在查询中使用JSON.stringfy(),但仍然失败,因为对象键上有引号.(例如:[{"id":1,"name":"Notebook"等}])如果没有报价请求将会起作用,我在postman 中测试.

const product = [{ id: 1, name: 'laptop', price: 500 }, { id: 2, name: 'book', price: 3 }]

const convertObj = product.reduce((acc, product) => {
    const { id, name, price } = offer;
    return { ...acc, id: id, name: name, price: price };
}, {});


// This make object key has "", and request would fail.
const productsQuery = `[${JSON.stringfy(convertObj)}]`;

const queryBody = `{sampleService(customerId: "${customerId}", purchaseItems: ${productsQuery}) {sessionId}}`;

const updateBody = {
    query: queryBody,
};

axios({
    method: "POST",
    url: "https://sample.com/",
    timeout: 10000,
    headers: {
        'Content-Type': 'application/json',
        'Authorization': sample_token
    }
    data: updateBody,
})
    .then((response) => {
        return response.data;
    })
    .catch((error) => {
        console.log('error', error)
    });

我正试图在Axios中实现这一点,但不确定在没有其他包的情况下是否可行. 谢谢你的建议.

推荐答案

您试图在需要GraphQL格式化的地方使用JSON格式化,而将产品数组转换为所需格式的逻辑不正确.GraphQL查询的正确方法是以GraphQL理解的格式将产品数组作为对象列表发送,而不是JSON字符串.

From个个

const productsQuery = `[${JSON.stringfy(convertObj)}]`;

const queryBody = `{sampleService(customerId: "${customerId}", purchaseItems: ${productsQuery}) {sessionId}}`;

To个个

const productsQuery = uniqueProducts.map(product => {
    return `{id:${product.id},name:"${product.name}",price:${product.price}}`;
}).join(",");

const queryBody = `{sampleService(customerId: "${customerId}", purchaseItems: [${productsQuery}]) {sessionId}}`;

Reduce函数逻辑对于预期目的是不正确的.它似乎试图从一组产品创建一个对象,但这不是GraphQL查询的正确方法,因为它需要一个项目数组,而不是一个对象.

大概是这样的.

From个个

const convertObj = product.reduce((acc, product) => {
    const { id, name, price } = offer;
    return { ...acc, id: id, name: name, price: price };
}, {});

To个个

const uniqueProducts = products.reduce((acc, product) => {
    if (!acc.find(p => p.id === product.id && p.name === product.name && p.price === product.price)) {
        acc.push(product);
    }
    return acc;
}, []);

演示

服务器端,另存为server.js

const express = require('express');
const bodyParser = require('body-parser');
const cors = require('cors');

const app = express();
app.use(cors());
app.use(bodyParser.json());

const products = [
    { id: 1, name: 'laptop', price: 500 },
    { id: 2, name: 'book', price: 3 },
    { id: 3, name: 'cd', price: 20 },
    { id: 4, name: 'television', price: 3000 }
];

function parseGraphQLItems(itemsString) {
    // Basic parsing logic for GraphQL format (adjust as needed)
    const itemObjects = itemsString.match(/{[^}]*}/g);
    return itemObjects ? itemObjects.map(item => {
        const idMatch = item.match(/id:(\d+)/);
        const nameMatch = item.match(/name:"([^"]+)"/);
        const priceMatch = item.match(/price:(\d+)/);

        return {
            id: idMatch ? parseInt(idMatch[1], 10) : null,
            name: nameMatch ? nameMatch[1] : null,
            price: priceMatch ? parseFloat(priceMatch[1]) : null
        };
    }) : [];
}

app.post('/', (req, res) => {
    try {
        console.log("Received request:", req.body);

        const query = req.body.query || '';
        // Extract customerId from the query
        const customerIdMatch = query.match(/customerId: "([^"]+)"/);
        const customerId = customerIdMatch ? customerIdMatch[1] : null;

        // Extract and parse the purchaseItems
        const purchaseItemsMatch = query.match(/purchaseItems: (\[.*?\])/);
        let purchaseItems = [];
        if (purchaseItemsMatch) {
            const purchaseItemsString = purchaseItemsMatch[1].replace(/(\w+):/g, '"$1":'); // Ensure proper JSON format
            purchaseItems = JSON.parse(purchaseItemsString);
        }
        console.log("Parsed purchaseItems:", purchaseItems);

        // Processing logic...
        const sessionData = purchaseItems.map(item => {
            const product = products.find(p => p.id === item.id);
            return product ? { ...product, customerId } : null;
        }).filter(item => item !== null);

        res.json({ sessionId: 'mock-session-id', purchasedItems: sessionData });
    } catch (error) {
        console.error(error);
        res.status(500).send('Internal Server Error');
    }
});

const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
    console.log(`Server running on http://localhost:${PORT}`);
});

客户端,另存为client.js

const axios = require('axios');
const customerId = 'your_customer_id'; // Replace with your actual customer ID
const sample_token = 'your_token'; // Replace with your actual token

const products = [{ id: 1, name: 'laptop', price: 500 }, { id: 2, name: 'book', price: 3 }];

const uniqueProducts = products.reduce((acc, product) => {
    if (!acc.find(p => p.id === product.id && p.name === product.name && p.price === product.price)) {
        acc.push(product);
    }
    return acc;
}, []);

// Convert each product to a GraphQL input object format
const productsQuery = uniqueProducts.map(product => {
    return `{id:${product.id},name:"${product.name}",price:${product.price}}`;
}).join(",");

const queryBody = `{sampleService(customerId: "${customerId}", purchaseItems: [${productsQuery}]) {sessionId}}`;

const updateBody = {
    query: queryBody,
};

axios({
    method: "POST",
    url: "http://localhost:3000/",
    timeout: 10000,
    headers: {
        'Content-Type': 'application/json',
        'Authorization': sample_token
    },
    data: updateBody,
})
.then((response) => {
    console.log('Response Data:', JSON.stringify(response.data, null, 4));
})
.catch((error) => {
    console.error('Error:', error);
});

Result

Left is the server, Right is the client enter image description here

Postman Test

在输入体中查询.

{
    "query": "{sampleService(customerId: \"your_customer_id\", purchaseItems: [{id:1,name:\"laptop\",price: 500},{id: 2,name:\"book\",price:3}]) {sessionId}}"
}

enter image description here

Javascript相关问答推荐

无法将nPM simplex-noise包导入在JS项目中工作

通过使用100%间隔时间来代表我们还剩多少时间来倒计时

更改JSON中使用AJAX返回的图像的路径

处理时间和字符串时MySQL表中显示的日期无效

手机上的渲染错误文本必须在文本组件中渲染,但在浏览器上没有问题<><>

如何在模块层面提供服务?

JS:XML insertBefore插入元素

Web Crypto API解密失败,RSA-OAEP

第二次更新文本输入字段后,Reaction崩溃

使用getBorbingClientRect()更改绝对元素位置

Node.js API-queryAll()中的MarkLogic数据移动

在渲染turbo流之后滚动到元素

用于测试其方法和构造函数的导出/导入类

有没有办法通过使用不同数组中的值进行排序

在JavaScript中,有没有一种方法可以迭代字符串的词法标记?

如何在Reaction中清除输入字段

脚本语法错误只是一个字符串,而不是一个对象?

在传单的图像覆盖中重新着色特定 colored颜色 的所有像素

使用onClick单击子元素时,使用交点观察器的关键帧动画意外运行

在采购unpept-visalizations.js时遇到问题