使用 nodeJs 构建网关

Building a gateway with nodeJs

我必须使用 nodeJs 为 API 构建一个层,并为前端创建一些端点。 我是 nodeJS 的新手,我已经构建了一些小型服务器来创建模型并使用 Mongo 制作一些 CRUD。 这是我第一次必须为现有的 API 创建一个中间层来过滤结果。 我做到了,并且采用了预期的格式,但是我从节点收到了一个错误,我不知道如何解决它。

原来API是这样的:

{
  id:'some id',
  pagination: {...},
  results: [...],
  other_results: [...],
  additional_info: [
    {
      id:'someid',
      info:'someinfo',
      values:[
        {
          id: 'someid',
          name: 'some category name',
          count: 999
        },
        {...},
        {...}
      ],
    },
    {...},
    {...}
  ]
}

我必须从“结果”和“additional_info”的第一个数组中“提取”数据。

我的端点必须return这种格式的数据:

{
  brand: {name: "Any brand", country: "Germany"},
  categories: ["category one", "category two", "category three"],
  items: [
    0: {id: "olmk23238777", name: "item one", imgUrl: 'img/34341.jpg', price: {total:424, currency: "USD"}, shipping: 'fast'},
    1: {id: "olmk23239348", name: "item two", imgUrl: 'img/34764.jpg', price: {total:47, currency: "USD"}, shipping: 'slow'},
    …]
}

我可以用这个实现:

const axios = require('axios');

exports.products = async query => {
  const url = `${process.env.BASE_URL}${query}`;

  let productsData = {
    brand: {
      name: 'Any Brand',
      country: 'Germany',
    },
  };

  try {
    const result = await axios({
      method: 'GET',
      url,
    });
    const data = result.data;
    productsData.categories = data.additional_info[0].values.map(
      ({ categoryName }) => categoryName
    );
    productsData.items = data.results.map(item => ({
      id: item.id,
      name: item.name,
      imgUrl: item.imgSrc,
      price: {
        total: parseInt(item.price),
        currency: item.currency,
      },
      shipping: item.shipping_method,
    }));

    return productsData;
  } catch (error) {
    console.log(error);
  }
};

这是控制器:

const { products } = require('../utils/products');

exports.searchItem = async (req, res) => {
  const { search } = req.query;
  try {
    const response = await products(search);
    res.send(response).json();
  } catch (error) {
    console.log(error);
  }
};


端点如下所示:

http://localhost:4000/api/products?search=shirt

这是错误

Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client

我尝试了不同的方法,但无法修复它

首先,您的错误在这里有一个解释: Error: Can't set headers after they are sent to the client

对于您的代码:

看这个:


res.send(response).json();

它应该是其中之一:


res.send(response);
// or
res.json(response);

参数type/structure,请参考所选库的文档。