CastError:模型的路径“_id”处的值“route-name”转换为 ObjectId 失败

2023-11-30

我似乎无法解决这个问题。当我点击此 URL 时收到此错误消息http://localhost:5000/sysaccess/test.

(节点:34256)UnhandledPromiseRejectionWarning:未处理的承诺拒绝(拒绝ID:1):CastError:模型“sysaccess”的路径“_id”处的值“test”转换为ObjectId失败 (节点:34256)[DEP0018] DeprecationWarning:未处理的承诺拒绝已被弃用。将来,未处理的 Promise 拒绝将会以非零退出代码终止 Node.js 进程。

在我的 sysaccess.js 路由中,我有这个:

const express = require('express');
const csv = require('csv-express');
const mongoose = require('mongoose');
const router = express.Router();
const {ensureAuthenticated} = require('../helpers/auth');

const Sysaccess = mongoose.model('sysaccess');
const Vendor = mongoose.model('vendor');


router.get('/test', (req, res) => {
  res.send('ok');
});

我将 sysaccess.js 路由与供应商.js 路由进行了比较,一切看起来都正常。我在vendor.js中有十几条路线,没有任何问题。我花了很多时间谷歌这个但没有找到任何东西。有人可以告诉我我在这里缺少什么吗?先感谢您!


中间件的顺序sysaccess.js路由器不对。

例如:

// "GET /sysaccess/test" will be processed by this middleware
router.get('/:id', (req, res) => {
  let id = req.params.id; // id = "test"
  Foo.findById(id).exec().then(() => {}); // This line will throw an error because "test" is not a valid "ObjectId"
});

router.get('/test', (req, res) => {
  // ...
});

解决方案一:使那些更具体的中间件位于那些更通用的中间件之前。

例如:

router.get('/test', (req, res) => {
  // ...
});

router.get('/:id', (req, res) => {
  // ...
});

解决方案2: use next将请求传递给下一个中间件

例如:

router.get('/:id', (req, res, next) => {
  let id = req.params.id;

  if (id === 'test') { // This is "GET /sysaccess/test"
    return next(); // Pass this request to the next matched middleware
  }

  // ...
});

router.get('/test', (req, res) => {
  // ...
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CastError:模型的路径“_id”处的值“route-name”转换为 ObjectId 失败 的相关文章

随机推荐