用req,res参数调用函数

时间:2020-11-02 19:25:44

标签: javascript node.js express

我正在使用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;
        });
    });

2 个答案:

答案 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)

我认为您应该重组应用程序。 将您的实际业务逻辑移到请求和响应处理之后的一层。 这样,您可以在不传递请求和响应对象的情况下重用服务/功能,这使您的代码更难以编写和理解。

相关问题