Javascript 使用nodeJs构建网关

Javascript 使用nodeJs构建网关,javascript,node.js,express,async-await,api-gateway,Javascript,Node.js,Express,Async Await,Api Gateway,我必须使用nodeJs为API构建一个层,并为前端创建一些端点。 我是nodeJS的新手,我已经用Mongo构建了一些小型服务器,创建了模型并制作了一些CRUD。 这是我第一次必须为现有API创建一个中间层来过滤结果。 我做到了,并且是以预期的格式,但是我从node得到了一个错误,我不知道如何解决它 原始API是这样的: { id:'some id', pagination: {...}, results: [...], other_results: [...], addit

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

原始API是这样的:

{
  id:'some id',
  pagination: {...},
  results: [...],
  other_results: [...],
  additional_info: [
    {
      id:'someid',
      info:'someinfo',
      values:[
        {
          id: 'someid',
          name: 'some category name',
          count: 999
        },
        {...},
        {...}
      ],
    },
    {...},
    {...}
  ]
}
http://localhost:4000/api/products?search=shirt
我必须从“结果”和第一个“附加信息”数组中“提取”数据

我的端点必须以以下格式返回数据:

{
  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);
  }
};


端点如下所示:

{
  id:'some id',
  pagination: {...},
  results: [...],
  other_results: [...],
  additional_info: [
    {
      id:'someid',
      info:'someinfo',
      values:[
        {
          id: 'someid',
          name: 'some category name',
          count: 999
        },
        {...},
        {...}
      ],
    },
    {...},
    {...}
  ]
}
http://localhost:4000/api/products?search=shirt
这就是错误所在

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

我尝试了不同的方法,但无法修复它首先,您的错误有一个解释:

对于您的代码:

看看这个:


res.send(response.json();
它应该是其中之一:


res.send(响应);
//或
res.json(响应);

有关参数类型/结构,请参阅所选库的文档。

res.json(响应)
而不是
res.send(response.json()谢谢!我到处寻找,但我看不到res.send(response.json()的错误;