首页 > 解决方案 > 错误:Route.put() 需要回调函数,但得到了 [object Undefined]

问题描述

当我运行时yarn build,一切正常,但是,当我运行时yarn start,我在终端中收到以下错误 -

$ NODE_ENV=production node ./dist/server.generated.js
/home/prithvi/Desktop/Socialize-app/node_modules/express/lib/router/route.js:202
        throw new Error(msg);
        ^

Error: Route.put() requires a callback function but got a [object Undefined]
    at Route.<computed> [as put] (/home/prithvi/Desktop/Socialize-app/node_modules/express/lib/router/route.js:202:15)
    at Object.9816 (/home/prithvi/Desktop/Socialize-app/dist/server.generated.js:1:71630)
    at o (/home/prithvi/Desktop/Socialize-app/dist/server.generated.js:1:77368)
    at Object.642 (/home/prithvi/Desktop/Socialize-app/dist/server.generated.js:1:63316)
    at o (/home/prithvi/Desktop/Socialize-app/dist/server.generated.js:1:77368)
    at /home/prithvi/Desktop/Socialize-app/dist/server.generated.js:1:78149
    at /home/prithvi/Desktop/Socialize-app/dist/server.generated.js:1:78597
    at Object.<anonymous> (/home/prithvi/Desktop/Socialize-app/dist/server.generated.js:1:78618)
    at Module._compile (node:internal/modules/cjs/loader:1095:14)
    at Object.Module._extensions..js (node:internal/modules/cjs/loader:1124:10)
    at Module.load (node:internal/modules/cjs/loader:975:32)
    at Function.Module._load (node:internal/modules/cjs/loader:816:12)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:79:12)
    at node:internal/main/run_main_module:17:47
error Command failed with exit code 1.

下面是路由文件,即

import express from 'express';
import UserCtrl from '../controllers/user.controller';
import authCtrl from '../controllers/auth.controller';
import postCtrl from '../controllers/post.controller';

const router = express.Router();

router
  .route('/api/posts/new:userId')
  .post(authCtrl.requireSignin, postCtrl.create);

router.route('/api/posts/photo/:postId').get(postCtrl.photo);

router
  .route('/api/posts/by/:userId')
  .get(authCtrl.requireSignin, postCtrl.listByUser);

router
  .route('/api/posts/feed/:userId')
  .get(authCtrl.requireSignin, postCtrl.listNewsFeed);

router.route('/api/posts/like').put(authCtrl.requireSignin, postCtrl.like);

router.route('/api/posts/unlike').put(authCtrl.requireSignin, postCtrl.unlike);

router
  .route('/api/posts/comment')
  .put(authCtrl.requireSignin, postCtrl.comment);

router
  .route('/api/posts/uncomment')
  .put(authCtrl.requireSignin, postCtrl.uncomment);

router
  .route('/api/posts/:postId')
  .delete(authCtrl.requireSignin, postCtrl.isPoster, postCtrl.remove);

router.param('userId', UserCtrl.userById);
router.param('postId', postCtrl.postById);

export default router;

这是控制器文件,即

import Post from '../models/post.model';
import errorHandler from './../helpers/dbErrorHandler';
import formidable from 'formidable';
import fs from 'fs';

const create = (req, res, next) => {
  let form = new formidable.IncomingForm();
  form.keepExtensions = true;
  form.parse(req, async (error, fields, files) => {
    if (error) {
      return res.status(400).json({
        error: 'Image could not be uploaded',
      });
    }
    let post = new Post(fields);
    post.postedBy = req.profile;
    if (files.photo) {
      post.photo.data = fs.readFileSync(files.photo.path);
      post.photo.contentType = files.photo.type;
    }
    try {
      let result = await post.save();
      res.json(result);
    } catch (error) {
      return res.status(400).json({
        error: errorHandler.getErrorMessage(error),
      });
    }
    console.log(error);
  });
};

const postById = async (req, res, next, id) => {
  try {
    let post = await Post.findById(id).populate('postedBy', '_id.name').exec();
    if (!post) {
      return res.status(404).json({
        error: 'Post not found',
      });
    }
    req.post = post;
    next();
  } catch (error) {
    return res.status(400).json({
      error: "Couldn't retrieve the user post",
    });
  }
};

const listByUser = async (req, res) => {
  try {
    let posts = await Post.find({ postedBy: req.profile._id })
      .populate('comments.postedBy', '_id name')
      .populate('postedBy', '_id name')
      .sort('-created')
      .exec();
    res.json(posts);
  } catch (err) {
    return res.status(400).json({
      error: errorHandler.getErrorMessage(err),
    });
  }
};

const listNewsFeed = async (req, res) => {
  let following = req.profile.following;
  following.push(req.profile._id);
  try {
    let posts = await Post.find({ postedBy: { $in: req.profile.following } })
      .populate('comments.postedBy', '_id name')
      .populate('postedBy', '_id name')
      .sort('-created')
      .exec();
    res.json(posts);
  } catch (err) {
    return res.status(400).json({
      error: errorHandler.getErrorMessage(err),
    });
  }
};

const remove = async (req, res) => {
  let post = req.post;
  try {
    let deletedPost = await post.remove();
    res.json(deletedPost);
  } catch (err) {
    return res.status(400).json({
      error: errorHandler.getErrorMessage(err),
    });
  }
};

const photo = (req, res, next) => {
  res.set('Content-Type', req.post.photo.contentType);
  return res.send(req.post.photo.data);
};

const like = async (req, res) => {
  try {
    let result = await Post.findByIdAndUpdate(
      req.body.postId,
      { $push: { likes: req.body.userId } },
      { new: true }
    );
    res.json(result);
  } catch (err) {
    return res.status(400).json({
      error: errorHandler.getErrorMessage(err),
    });
  }
};

const unlike = async (req, res) => {
  try {
    let result = await Post.findByIdAndUpdate(
      req.body.postId,
      { $pull: { likes: req.body.userId } },
      { new: true }
    );
    res.json(result);
  } catch (err) {
    return res.status(400).json({
      error: errorHandler.getErrorMessage(err),
    });
  }
};

const comment = async (req, res) => {
  let comment = req.body.comment;
  comment.postedBy = req.body.userId;
  try {
    let result = await Post.findByIdAndUpdate(
      req.body.postId,
      { $push: { comments: comment } },
      { new: true }
    )
      .populate('comments.postedBy', '_id name')
      .populate('postedBy', '_id name')
      .exec();
    res.json(result);
  } catch (err) {
    return res.status(400).json({
      error: errorHandler.getErrorMessage(err),
    });
  }
};
const uncomment = async (req, res) => {
  let comment = req.body.comment;
  try {
    let result = await Post.findByIdAndUpdate(
      req.body.postId,
      { $pull: { comments: { _id: comment._id } } },
      { new: true }
    )
      .populate('comments.postedBy', '_id name')
      .populate('postedBy', '_id name')
      .exec();
    res.json(result);
  } catch (err) {
    return res.status(400).json({
      error: errorHandler.getErrorMessage(err),
    });
  }
};

// Used to authenticate user to verify if the user who
// posted is same as the user who is deleting it.
const isPoster = (req, res, next) => {
  let isPoster = req.post && req.auth && req.post.postedBy._id == req.auth._id;
  if (!isPoster) {
    return res.status('403').json({
      error: 'User is not authorized',
    });
  }
  next();
};

export default {
  listByUser,
  listNewsFeed,
  create,
  postById,
  remove,
  photo,
  like,
  unlike,
  comment,
  uncomment,
  isPoster,
};

我使用的模块版本是 -

该错误的原因是什么?

标签: javascriptnode.jsexpressroutesexpress-router

解决方案


推荐阅读