简体   繁体   中英

Route.post() requires a callback function but got a [object Undefined] In ExpressJs

I'm aware this question has been asked before. I tried all the solutions that were provided but still I'm stuck. Please have a look at my code:

1) ReviewController.js

exports.setTourUserIds = (req, res, next) => {
    // allow nested route
    if (!req.body.tour) req.body.tour = req.params.tourId
    if (!req.body.user) req.body.user = req.user.id
    next()
}
exports.createReview = handlerFactory.createOne(Review)
exports.updateReview = handlerFactory.updateOne(Review)
exports.deleteReview = handlerFactory.deleteOne(Review)

2) ReviewRoute.js

let express = require('express')
let Router = express.Router({ mergeParams: true })
let reviewController = require('../controllers/reviewController')
let authController = require('../controllers/authController')

Router
    .route('/')
    .get(reviewController.getAllReviews)
    .post(authController.protect,
        authController.restrictTo('user'),
        reviewController.setTourUserIds,
        reviewController.createReview)

Router
    .route('/:id')
    .get(authController.protect, reviewController.getReview)
    .patch(reviewController.updateReview)
    .delete(reviewController.deleteReview)

module.exports = Router

3) handlerFactory.js

exports.createOne = Model => catchAsync(async (req, res, next) => {
    let doc = await Model.createOne(req.body)
    if (!doc) {
        return next(new AppError('No document found with that ID', 404))
    }
    res.status(201).json({
        status: 'success!',
        data: { doc }
    })
})

Please change your code from

exports.createReview = handlerFactory.createOne(Review)
exports.updateReview = handlerFactory.updateOne(Review)
exports.deleteReview = handlerFactory.deleteOne(Review)

to

exports.createReview = () => { handlerFactory.createOne(Review)}
exports.updateReview = () => { handlerFactory.updateOne(Review) }
exports.deleteReview = () => { handlerFactory.deleteOne(Review) }

You should pass a function to the router Check following syntax:

Router
.route('/:id').post(function(){})

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM