当前位置: 首页 > 知识库问答 >
问题:

CastError:对于模型“customer”的路径“\u id”处的值“customers”,转换为ObjectId失败

曾航
2023-03-14

我希望有人能帮我找出我在这里做错了什么。我一直在寻找,我可以找到很多类似的问题,但没有一个我足够聪明来解决我的问题。我得到以下错误:

CastError:对于模型“customer”的路径“\u id”处的值“customers”,转换为ObjectId失败

它以前是有效的,我设法打破了它,我解开了所有我认为我改变了的东西,我仍然得到了错误。

这是我的模式

const Schema = mongoose.Schema;

const CustomerSchema = new Schema({

  custName: {
    type: String,
    required: true
  },
  custStreet: {
    type: String
  },
  custCity: {
    type: String
  },
  custState: {
    type: String
  },
  custZip: {
    type: String
  }
});

module.exports = Customer = mongoose.model('customer', CustomerSchema); 

我的路线:

const router = express.Router();

const customerController = require('../../controllers/customer')

const Customer = require('../../models/Customer');

router.route('/')
  .get(customerController.index)
  .post(customerController.newCustomer);

router.route('/:customerID')
  .get(customerController.getCustomer)

module.exports = router;

和我的控制器:


module.exports = {

  index: async (req, res, next) => {
    try {
    const customers = await Customer.find({})
    res.status(200).json(customers);
  } catch(err) {
      next(err);
    }
  },

  newCustomer: async (req, res, next) => {
    try {
    const newCustomer = await Customer(req.body);
    const customer = await newCustomer.save();
    res.status(201).json(customer);
      } catch(err) {
          next(err);
      }
  }, 

  getCustomer: async(req, res, next) => {
    try {
    const { customerID } = req.params;
    const customer= await Customer.findById(customerID);
    res.status(200).json(customer);  
    } catch(err) {
        next(err);
    }
  }
};

此外,以下是我得到的全部信息:

CastError:对于模型中的模型“customer”,路径“\u id”处的值“customers”,转换为ObjectId失败。查询模型上的exec(C:\Users\natha\Desktop\Coding\HAMMER\node\u modules\mongoose\lib\query.js:4371:21)。查询查询然后(C:\Users\natha\Desktop\Coding\HAMMER\node\u modules\mongoose\lib\query.js:4463:15)在processtick和rejections(internal/process/task\u queues.js:93:5)

还有一些让我困惑的事情,我的数据库中有另一个集合的路由文件和控制器。它基本上是相同的代码,除了没有路由到“/:Customers”之外,它路由到“/:Tickets”,并且工作正常。我看不出这个代码是如何工作的,客户代码不是。

路线:

const router = express.Router();

const ticketController = require('../../controllers/ticket');

router.route('/')
  .get(ticketController.index)
  .post(ticketController.newTicket);

router.route('/:ticketID')
  .get(ticketController.getTicket)
  .put(ticketController.replaceTicket)
  .patch(ticketController.updateTicket);

module.exports = router;

控制器:


module.exports = {

 index: async(req, res, next) => {
   try {
     const tickets = await Ticket.find({})
     res.status(200).json(tickets);
   } catch(err) {
     next(err);
   }
 },

 newTicket: async (req, res, next) => {
   try {
     const newTicket = await Ticket(req.body);
     const ticket = await newTicket.save();
     res.status(201).json(ticket);
   } catch(err) {
      next(err);
   }
 },

 getTicket: async(req, res, next) => {
  try {
  const { ticketID } = req.params;
  const ticket = await Ticket.findById(ticketID);
  res.status(200).json(ticket);
  } catch(err) {
      next(err);
  }
 }, 

 replaceTicket: async(req, res, next) =>{
   try {
     const { ticketID } = req.params;
     const newTicket = req.body;
     const result = await Ticket.findByIdAndUpdate(ticketID, newTicket);
     res.status(200).json({ Success: true });
   } catch(err) {
      next(err);
   }
 },

 updateTicket: async(req, res, next) =>{
   try {
     const { ticketID } = req.params;
     const newTicket = req.body;
     const result = await Ticket.findByIdAndUpdate(ticketID, newTicket);
     res.status(200).json({ Success: true });
   } catch(err) {
      next(err);
   }
 } 
};

我将感谢任何帮助!

谢谢

-N8

共有3个答案

储峻
2023-03-14

我对OP的解决方案投了更高的票。为了节省大量时间,我只想解释为什么这是一个问题,以及其他人可以在OP服务器中像我一样关注什么。js,“/”排在其他路由之前,这些路由违反规则首先列出特定路由。也就是说,如果在其他路由问题解决后移动了“/”。更重要的是,这个错误来自哪里?当您调用任何其他路由时,您的应用程序将首先调用“/”并使用客户的路由,同时将路由路径(即“/customers”、““/materials”、““/tickets”)作为id参数传递,然后mongo将尝试在客户集合中将客户、物料和票据作为id强制转换。

app.use('/customers', customers);
app.use('/materials', materials)
app.use('/tickets', tickets)
app.use('/', customers);

这将解决OP的问题。

就我而言,这就是问题所在:

router.get('/', getAllUser);
router.get('/:id', getUserById)
router.get('/facebook', facebookPassport)
router.get('/google', customersPassport);

因此,我在这里为模型用户的路径“\u id”处的值“facebook”/“google”得到这个错误投射错误,因为最后两个路由中的字符串“facebook”和“google”是特定的,但永远不会到达,因为“/:id”路由将接受“/”之后的任何值作为id。当我这样重新排列时:

router.get('/', getAllUser);
router.get('/facebook', facebookPassport)
router.get('/google', customersPassport);
router.get('/:id', getUserById)

带走:在应用级别和路由文件中将特定路由移动到动态路由(带参数的路由)的顶部。

陈斌
2023-03-14

您在getCustomer处理程序中出错。

您不应该使用字符串id来查找客户,而是必须首先使用mongoose。类型。ObjectId(字符串ID)

getCustomer: async(req, res, next) => {
    try {
    const { customerID } = req.params;
    const customer= await Customer.findById(mongoose.Types.ObjectId(customerID));
    res.status(200).json(customer);  
    } catch(err) {
        next(err);
    }
  }
华宪
2023-03-14

我发现了问题。我server.js档案里有这个:

app.use('/', customers);
app.use('/customers', customers);
app.use('/materials', materials)
app.use('/tickets', tickets)

一旦我摆脱了应用程序。使用(“/”,客户) 一切都很好。

 类似资料:
  • 好吧,我看到这里有一些这样的帖子,但他们没有帮助我。。。 让我描述一下我的问题: 我有两个模式 现在我已经有了一个B对象,我想创建一个a对象。 所以我这样做: b对象是从我的monogDB加载的。调试器为我的b显示了一个有效的ObjectId(53627ed535d9d04416e26218或Sb~Õ5ÙÐDáb)。 但是,当我保存新的A-Object时,会出现错误:“CastError:Cast

  • 我试图在一个MEAN堆栈应用程序中处理一个计划。当我调用findOne时,我得到了这个错误: 我就是这样做的: 我注意到,当我把id作为一个字符串(如下所示)时,一切正常。 所以,我控制台: 我一直在尝试我在这里找到的东西,但任何东西都可以帮助我解决这个问题:/

  • 嘿,伙计们真的需要一些关于删除路由的帮助。我正在使用RESTful路由,尝试遵循约定,添加删除路由时,我得到错误: CastError:模型"Blog"的路径"_id"处的值"X"转换为ObjectId失败 我已经在stackoverflow上搜索了这个问题,我能想到的最好的版本是猫鼬有一个错误。我把它回滚到V4.10.0,仍然在处理这个问题。我的代码如下:

  • 我的控制器obter_todos_precos只是一个console.log,没有使用任何模型,但我得到以下错误: 为什么我会有这种行为?

  • 前言:我对猫鼬/Express的工作相对来说是新手。 我试图制作一个应用程序,其中一个名为“space”的猫鼬模式中有一个名为“posts”的数组。数组的内容是对另一个名为“POST”的猫鼬模式的ObjectId引用。然而,每次我对应该发送回我的空间和其中的帖子的路线提出GET请求时,我都会得到一个严重的错误。此外,我的帖子没有填充我的空间。 错误:CastError:对于模型“space”的路径

  • Comments是嵌套在Post架构中的数组。我想通过推送一个新的评论到评论数组更新相应的帖子。但是得到了错误:CastError:对于模型“post”的路径“_id”处的值“comments”,向ObjectId的强制转换失败 阅读相关帖子 尝试使用“mongoose.types.objectid”,但不起作用 猫鼬版^5.5.4 我在这里使用的所有ID都是有效的 我认为问题出在“comment