首页 > 解决方案 > 无法发布路由获取对象未定义而不是 Node Js 中的回调

问题描述

我正在尝试在我的应用程序中创建一个最喜欢的路线,这样如果有人添加到收藏夹中,那么在架构中露营地的 id 将保存在收藏夹 [] 中。我首先检查营地 id 是否在数组中,如果为真,则拉出 id,如果不是,然后推入数组,然后显示在用户配置文件中。在这里你可以找到所有文件 filehosting.org/file/details/859995/project1%20-%20Copy.rar

但每次它都显示这个

Copy\node_modules\express\lib\router\route.js:202
        throw new Error(msg);
        ^

Error: Route.post() requires a callback function but got a [object Undefined]
    at Route.<computed> [as post] (D:\college\project1 - Copy\node_modules\express\lib\router\route.js:202:15)
    at Function.proto.<computed> [as post] (D:\college\project1 - Copy\node_modules\express\lib\router\index.js:510:19)
    at Object.<anonymous> (D:\college\project1 - Copy\routes\campgrounds.js:135:8)
    at Module._compile (internal/modules/cjs/loader.js:1158:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1178:10)
    at Module.load (internal/modules/cjs/loader.js:1002:32)
    at Function.Module._load (internal/modules/cjs/loader.js:901:14)
    at Module.require (internal/modules/cjs/loader.js:1044:19)
    at require (internal/modules/cjs/helpers.js:77:18)
    at Object.<anonymous> (D:\college\project1 - Copy\app.js:20:23)
    at Module._compile (internal/modules/cjs/loader.js:1158:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1178:10)
    at Module.load (internal/modules/cjs/loader.js:1002:32)
    at Function.Module._load (internal/modules/cjs/loader.js:901:14)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:74:12)
    at internal/main/run_main_module.js:18:47

路线代码

router.post("/:id/favorite", middleware.isloggedin, function(req, res) {
   User.findById(req.user._id, function(err, user) {
        if (err) {
            console.log(err);
            return res.redirect("/c");
        }

        // check if req.user._id exists in foundCampground.favorites
        var foundUserfavorite = user.favorites.some(function(favorite) {
            return favorite.equals(req.params.id);
        });

        if (foundUserfavorite) {
            // user already favorited, removing favorite
            user.favorites.pull(req.params.id);
        } else {
            // adding the new user favorite
            user.favorites.push(req.params.id);
        }

        user.save(function(err) {
            if (err) {
                console.log(err);
                return res.redirect("/c");
            }
            return res.redirect("/c");
        });
    });
});

演出.ejs

<div style="padding-bottom: 10px;">
 <form action="/campgrounds/<%= campground._id %>/favorite" method="POST">
    <div class="btn-group">
     <% if (currentUser && user.favorites.some(function (favorite) {
           return favorite.equals(campground._id)
                      })) { %>
          <button class="btn btn-sm btn-primary">
        <i class="fas fa-heart"></i> favorited 
          </button>
       <% } else { %>
       <button class="btn btn-sm btn-secondary">
        <i class="fas fa-heart"></i> add to favorite 
          </button>
            <% } %>
    </div>
</form>

用户模式

var mongoose = require("mongoose");
var plm = require("passport-local-mongoose");
var userSchema = new mongoose.Schema({
    username: { type: String, unique: true, required: true },
    password: String,
    avatar: String,
    favorites: [{
        type: mongoose.Schema.Types.ObjectId,
        ref: "Campground"
    }],
    reputation: { type: String, default: 'noob' },
    rPT: String,
    rPE: Date,
    email: { type: String, unique: true, required: true },
    isadmin: { type: Boolean, default: false }
});
userSchema.plugin(plm);
module.exports = mongoose.model("User", userSchema);

中间件

var Campground = require("../models/campground");
var Comment = require("../models/comment");
var middlewareo = {};
middlewareo.checkcampowner = function(req, res, next) {
    if (req.isAuthenticated()) {
        Campground.findById(req.params.id, function(err, foundcaa) {
            if (err || !foundcaa) {
                req.flash("error", "Not Found");
                res.redirect("back");
            } else {
                // console.log(foundcaa.author.id);// console.log(req.user._id);
                if (foundcaa.author.id.equals(req.user._id) || req.user.isadmin) {
                    next();
                } else {
                    req.flash("error", "You Don't Have Permission");
                    res.redirect("back");
                }
            }
        });
    } else {
        req.flash("error", "Please Login to Edit")
        res.redirect("back");
    }
}
middlewareo.checkcomow = function(req, res, next) {
    if (req.isAuthenticated()) {
        Comment.findById(req.params.comment_id, function(err, foundcomm) {
            if (err || !foundcomm) {
                req.flash("error", "Not Found");
                res.redirect("/c");
            } else {
                // console.log(foundcaa.author.id);// console.log(req.user._id);
                if (foundcomm.author.id.equals(req.user._id) || req.user.isadmin) {
                    next();
                } else {
                    req.flash("error", "Permission Denied");
                    res.redirect("back");
                }
            }
        });
    } else {
        req.flash("error", "Please Login");
        res.redirect("back");
    }
}
middlewareo.isloggedin = function(req, res, next) {
    if (req.isAuthenticated()) {
        return next();
    }
    req.flash("error", "Please Login!!");
    res.redirect("/login");
};
module.exports = middlewareo;

标签: javascriptnode.jsexpressmongoose

解决方案


您的问题在文件 /routes/campgrounds.js 第 135 行,将其更改为:

router.post("/:id/favorite", middleware.isloggedin, function (req, res) {

您的中间件功能isLoggedIn应更改为isloggedin

只是一个简单的错误大小写字母错误。

一些提示和最佳实践:

  1. 只需调用 app.js 中的索引路由文件并在其中调用其他人
  2. 护照包中存在 isLoggedIn() 函数。使用起来更容易
  3. 如果您使用 IDE,它会向您显示对象上存在的元素并防止此类错误
  4. 更加注意您的堆栈跟踪错误,它说错误在 campgrounds.js 文件第 135 行

推荐阅读