对于模型的路径 \ _id \ 处的值,获取错误转换为 objectId 失败

Piy*_*tal 1 mongoose mongodb node.js express

我试图从登录用户的数据库中获取订单,但是当我获取它时,我从数据库中收到错误,这是我的代码:-

// @desc   Get logged in user orders
// @route  GET /api/orders/myorders
// @access Private
const getMyOrders = asyncHandler(async (req, res) => {
    const orders = await Order.find({ user: req.user._id })
    res.json(orders);
})
Run Code Online (Sandbox Code Playgroud)

这是我的路线文件:-

import express from 'express';
import { addOrderItems, getMyOrders, getOrderById, updateOrderToPaid } from '../controllers/orderController.js';
import { protect } from '../middleware/authMiddleware.js';

const router = express.Router();

router.route('/').post(protect, addOrderItems)
router.route('/:id').get(protect, getOrderById)
router.route('/:id/pay').put(protect, updateOrderToPaid)
router.route('/myorders').get(protect, getMyOrders)

export default router;
Run Code Online (Sandbox Code Playgroud)

这是我的订单模型文件

import mongoose from 'mongoose';

const orderSchema = mongoose.Schema({
    user: {
        type: mongoose.Schema.Types.ObjectId,
        required: true,
        ref: 'User'
    },
    orderItems: [
        {
            name: { type: String, required: true },
            qty: { type: Number, required: true },
            image: { type: String, required: true },
            price: { type: Number, required: true },
            product: {
                type: mongoose.Schema.Types.ObjectId,
                required: true,
                ref: 'Product'
            }
        }
    ],
    shippingAddress: {
        address: { type: String, required: true },
        city: { type: String, required: true },
        postalCode: { type: String, required: true },
        country: { type: String, required: true }
    },
    paymentMethod: {
        type: String,
        required: true
    },
    paymentResult: {
        id: { type: String },
        status: { type: String },
        update_time: { type: String },
        email_address: { type: String }
    },
    taxPrice: {
        type: String,
        required: true,
        default: 0.0
    },
    shippingPrice: {
        type: String,
        required: true,
        default: 0.0
    },
    totalPrice: {
        type: String,
        required: true,
        default: 0.0
    },
    isPaid: {
        type: Boolean,
        required: true,
        default: false
    },
    paidAt: {
        type: Date
    },
    isDelivered: {
        type: Boolean,
        required: true,
        default: false
    },
    deliveredAt: {
        type: Date
    }
}, {
    timeStamps: true
})

const Order = mongoose.model('Order', orderSchema)

export default Order;
Run Code Online (Sandbox Code Playgroud)

我还上传了我的保护中间件,在其中添加了我的保护路由并从中获取用户

import jwt from 'jsonwebtoken';
import asyncHandler from 'express-async-handler';
import User from '../models/userModel.js';

const protect = asyncHandler(async (req, res, next) => {
    let token;

    if (req.headers.authorization && req.headers.authorization.startsWith('Bearer')) {
        try {
            token = req.headers.authorization.split(' ')[1]
            const decoded = jwt.verify(token, process.env.JWT_SECRET)

            req.user = await User.findById(decoded.id).select('-password')
            next()
        } catch (error) {
            console.log(error)
            res.status(401)
            throw new Error('Not authorized, token not found')
        }
    }

    if (!token) {
        res.status(401)
        throw new Error('Not authorized')
    }

})

export { protect }
Run Code Online (Sandbox Code Playgroud)

我的错误:-

{
    "message": "Cast to ObjectId failed for value \"myorders\" at path \"_id\" for model \"Order\"",
    "stack": "CastError: Cast to ObjectId failed for value \"myorders\" at path \"_id\" for model \"Order\"\n    at model.Query.exec (C:\\proShop\\node_modules\\mongoose\\lib\\query.js:4358:21)\n    at model.Query.Query.then (C:\\proShop\\node_modules\\mongoose\\lib\\query.js:4450:15)\n    at processTicksAndRejections (internal/process/task_queues.js:93:5)"
}
Run Code Online (Sandbox Code Playgroud)

我上传了我的所有文件和代码,任何人都知道解决方案,请告诉我。

小智 6

我认为问题是因为当你将 (/:id) 放在 (/myorder) 上方时,然后你用 /.../myorders 输入 URL,Route 会将 myorders 视为 id,并且它不是 ObjectId 类型