首页 > 解决方案 > Node.js 路由发送到不正确的控制器

问题描述

问题:当我调用此路由/topproducts时,它进入orders_get_order函数而不是orders_most_ordered_products. 这很奇怪,我不明白为什么它输入了错误的功能。

控制台错误信息:

message: 'Cast to ObjectId failed for value "topproducts" at path "_id" for model "Order"',
    name: 'CastError',
    stringValue: '"topproducts"',
    kind: 'ObjectId',
    value: 'topproducts',
    path: '_id',
    reason: undefined,
    model: Model { Order }

我的 route.js

router.get("/topproducts", checkAuth, OrdersController.orders_most_ordered_products);

我的控制器 order.js

exports.orders_most_ordered_products = async (req, res) => {
  try{
    let order = await order_service.get_most_ordered_products();
    if ('error' in order){
      res.status(order['status']).json(order)
    }else{
      res.status(200).json(order)
    }
  }catch(err){
    console.log("most orders")
    console.log(err)
    //res.status(500).json(fatal_error_status);
  }
};

//get uma order
exports.orders_get_order = async (req, res) => {
  try{
    let order = await order_service.get(req.params.orderId);
    if ('error' in order){
      res.status(order['status']).json(order)
    }else{
      res.status(200).json(order)
    }
  }catch(err){
    console.log("get orders")
    console.log(err)
    //res.status(500).json(fatal_error_status);
  }
};

然后它发送到服务 order.js

exports.orders_most_ordered_products = async (req, res) => {
  try{
    let order = await order_service.get_most_ordered_products();
    if ('error' in order){
      res.status(order['status']).json(order)
    }else{
      res.status(200).json(order)
    }
  }catch(err){
    console.log("most orders")
    console.log(err)
  }
};

exports.orders_get_order = async (req, res) => {
  try{
    let order = await order_service.get(req.params.orderId);
    if ('error' in order){
      res.status(order['status']).json(order)
    }else{
      res.status(200).json(order)
    }
  }catch(err){
    console.log("get orders")
    console.log(err)
  }
};

标签: node.jsmongoose

解决方案


问题是路由的顺序,将 Id 作为参数的路由是第一个,所以服务器虽然我正在调用那个。

router.get("/topproducts", checkAuth, OrdersController.orders_most_ordered_products);

router.get("/:orderId", checkAuth, OrdersController.orders_get_order);

推荐阅读