我正在使用Express在NodeJS上创建API。我在产品架构中有一个函数,该函数按ID返回产品。该函数的签名如下:
let getProductsById = (req, res) => {
let id = req.params.id;
Producto.findById(id)
.populate('categoria')
.populate('marca')
.exec((err, producto) => {
if (err) {
return res.status(500).json({
ok: false,
error: err
});
}
if (!producto) {
return res.status(400).json({
ok: false,
error: {
message: 'Producto no encontrado'
}
});
}
productoResponse = {
_id: producto._id,
codigo: producto.codigo,
descripcion: producto.descripcion,
nombre: producto.nombre,
precioCosto: producto.precioCosto,
precioVenta: producto.precioVenta,
categoria: {
_id: producto.categoria._id,
nombre: producto.categoria.nombre
},
marca: {
_id: producto.marca._id,
nombre: producto.marca.nombre
}
}
res.json({
ok: true,
producto: productoResponse
});
});
}
如果您不想阅读整个函数,请在继续执行此操作时返回其中包含一些信息的对象。
我在路由器中这样调用此功能:
app.get('/producto/:id', function(req, res) {
getProductsById(req, res);
});
这工作正常,但是我想在另一个架构(购物车)中调用此函数来接收产品。在购物车服务中,我具有以下功能:
let addCart = (req, res) => {
let body = req.body;
let cart = new Cart({
user: body.user,
products: body.products,
pay: body.pay,
address: body.address,
phone: body.phone,
moreInfo: body.moreInfo,
total: body.total
});
cart.products.forEach(product => {
console.log(product._id);
req.params.id = product._id;
let productX = getProductsById(req,res);
});
}
但是这不起作用,我看到一条错误消息:
events.js:288
throw er; // Unhandled 'error' event
^
Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
at ServerResponse.setHeader (_http_outgoing.js:526:11)
at ServerResponse.header (C:\Users\Nacho\Desktop\node\07-restserver\node_modules\express\lib\response.js:771:10)
at ServerResponse.send (C:\Users\Nacho\Desktop\node\07-restserver\node_modules\express\lib\response.js:170:12)
at ServerResponse.json (C:\Users\Nacho\Desktop\node\07-restserver\node_modules\express\lib\response.js:267:15)
at C:\Users\Nacho\Desktop\node\07-restserver\server\services\productService.js:57:40
at C:\Users\Nacho\Desktop\node\07-restserver\node_modules\mongoose\lib\model.js:4832:16
at C:\Users\Nacho\Desktop\node\07-restserver\node_modules\mongoose\lib\helpers\promiseOrCallback.js:24:16
at C:\Users\Nacho\Desktop\node\07-restserver\node_modules\mongoose\lib\model.js:4855:21
at C:\Users\Nacho\Desktop\node\07-restserver\node_modules\mongoose\lib\query.js:4407:11
at C:\Users\Nacho\Desktop\node\07-restserver\node_modules\kareem\index.js:135:16
at processTicksAndRejections (internal/process/task_queues.js:79:11)
Emitted 'error' event on Function instance at:
at C:\Users\Nacho\Desktop\node\07-restserver\node_modules\mongoose\lib\model.js:4834:13
at C:\Users\Nacho\Desktop\node\07-restserver\node_modules\mongoose\lib\helpers\promiseOrCallback.js:24:16
[... lines matching original stack trace ...]
at processTicksAndRejections (internal/process/task_queues.js:79:11) {
code: 'ERR_HTTP_HEADERS_SENT'
}
如何解决此问题?是的
我决心这样做(不要遵循我的步骤是不好的,我需要重组代码)
carrito.productos.forEach(producto => {
console.log(producto._id);
let id = producto._id;
Producto.findById(id)
.exec((err, productoObtenido) => {
if (err) {
return false;
}
if (!productoObtenido) {
return false;
}
producto.precioVenta = productoObtenido.precioVenta;
});
});
答案 0 :(得分:1)
问题在这里
cart.products.forEach(product => {
console.log(product._id);
req.params.id = product._id;
let productX = getProductsById(req,res);
});
因此,您从res.send
起多次致电getProductsById
他们表示拒绝。
答案 1 :(得分:1)
我认为您应该重组应用程序。 将您的实际业务逻辑移到请求和响应处理之后的一层。 这样,您可以在不传递请求和响应对象的情况下重用服务/功能,这使您的代码更难以编写和理解。