使用 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,请参考所选库的文档。
我必须使用 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,请参考所选库的文档。