首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我试过在猫鼬中使用填充,但没有用

我试过在猫鼬中使用填充,但没有用
EN

Stack Overflow用户
提问于 2020-03-26 13:01:10
回答 1查看 73关注 0票数 0

大家好,我遇到麻烦了,也许你可以帮我。因此,基本上,我在猫鼬中创建了2集合,在用户注册或登录时创建了用户详细信息,为他们发布的菜谱创建了还希望在用户集合中保存每个菜谱的用户帖子(比如填充猫鼬属性)。就像user1发布recipe1一样,它应该保存在菜谱集合中,也可以保存在发布此信息的用户数据中。为此,我尝试使用填充方法,如下面的代码所示,但当我将一些菜谱仅存储在食谱集合中时,用户集合中的“post”键始终为空。我想在用户集合的"posts“键中保存菜谱。请指导我怎么做。

代码语言:javascript
运行
复制
require('dotenv').config()
const express = require("express");
const bodyParser = require("body-parser");
const ejs = require("ejs");
const requestObj = require("request");
const https = require("https");
const multer = require("multer");
const path = require("path");
const mongoose = require('mongoose');
const session = require('express-session');
const passport = require("passport");
const passportLocalMongoose = require("passport-local-mongoose");
const findOrCreate = require('mongoose-findorcreate');
const app = express();
const GoogleStrategy = require('passport-google-oauth20').Strategy;


app.set("view engine", "ejs");
app.use(bodyParser.urlencoded({
  extended: true
}));
app.use(express.static("public"));

app.use(session({
  secret: "This is my secret",
  resave: false,
  saveUninitialized: false
}));

app.use(passport.initialize());
app.use(passport.session());

// Mongoose connection
mongoose.connect("mongodb://localhost:27017/recipeUsers", {
  useNewUrlParser: true,
  useUnifiedTopology: true
});
mongoose.set('useCreateIndex', true);

//mongoose schema



const userSchema = new mongoose.Schema({
  username: String,
  password: String,
  googleId: String,
  name: String,
  posts: [{
    type: mongoose.Schema.Types.ObjectId,
    ref: 'Recipe'
  }]
});

const recipeSchema = new mongoose.Schema({
  genre: String,
  name: String,
  description: String,
  ingredients: [{
    type: String
  }],
  method: [{
    type: String
  }],
  imageName: String,
  author: {
    type: mongoose.Schema.Types.ObjectId,
    ref: 'User'
  }
});

userSchema.plugin(passportLocalMongoose);
userSchema.plugin(findOrCreate);

// model
const Recipe = mongoose.model("Recipe", recipeSchema);
const User = mongoose.model("User", userSchema);

module.exports = {
  User,
  Recipe,
}

passport.use(User.createStrategy());

passport.serializeUser(function(user, done) {
  done(null, user.id);
});

passport.deserializeUser(function(id, done) {
  User.findById(id, function(err, user) {
    done(err, user);
  });
});

passport.use(new GoogleStrategy({
    clientID: process.env.CLIENT_ID,
    clientSecret: process.env.CLIENT_SECRET,
    callbackURL: "http://localhost:5000/auth/google/index",
    userProfileURL: "https://www.googleapis.com/oauth2/v3/userinfo"
  },
  function(accessToken, refreshToken, profile, cb) {
    // console.log(profile);
    User.findOrCreate({
      googleId: profile.id,
      name: profile.displayName
    }, function(err, user) {
      return cb(err, user);
    });
  }
));


var storage = multer.diskStorage({
  destination: (req, file, cb) => {
    cb(null, "public/img/uploads")
  },
  filename: (req, file, cb) => {
    cb(null, file.fieldname + '-' + Date.now() + path.extname(file.originalname));
  }
});

var upload = multer({
  storage: storage,
  limits: {
    fileSize: 5 * 1024 * 1024
  }
});


app.use((req, res, next) => {
  res.locals.isAuthenticated = req.isAuthenticated();
  if (req.isAuthenticated()) {
    currentUser = req.user.name;
  }
  next();
});

app.get("/", function(req, res) {
  res.render("index");
});

app.get("/index", (req, res) => {
  res.render('index');
});

app.get("/about", function(req, res) {
  res.render("about");
});

app.route("/search")
  .get(function(req, res) {
    res.render("search");
  })
  .post(function(req, res) {
    const searchRecipe = req.body.recipeName;
    Recipe.findOne({
      name: searchRecipe
    }, (err, foundRecipe) => {
      if (err) {
        res.send(err);
      } else {
        if (foundRecipe) {
          res.render("recipe", {
            dishName: foundRecipe.name,
            descrip: foundRecipe.description,
            genre: foundRecipe.genre,
            ingredients: foundRecipe.ingredients,
            steps: foundRecipe.method,
            author: foundRecipe.author,
            dishImage: foundRecipe.imageName
          });
        } else {
          res.redirect("/Failure");
        }
      }
    });
  });

app.get("/Failure", function(req, res) {
  res.render("Failure");
});


app.route("/post")
  .get(function(req, res) {
    if (req.isAuthenticated()) {
      res.render("post", {
        message: ""
      });
    } else {
      res.redirect("/login");
    }

  })
  .post(upload.single('dishImage'), function(req, res, next) {
    const dishType = req.body.recipeGenre;
    const description = req.body.description;
    const dishName = req.body.dishName;
    const ingredient = req.body.ingredients;
    const step = req.body.steps;
    // const authorName = req.body.author;
    // const url = "https://polar-oasis-10822.herokuapp.com/recipes";
    const file = req.file;
    if (!file) {
      const error = new Error("Please upload a image");
      error.httpStatusCode = 400;
      return next(error);
    }
    // console.log(req.user);
    const dish = new Recipe({
      genre: dishType,
      name: dishName,
      description: description,
      ingredients: ingredient,
      method: step,
      imageName: file.filename,
    });
    dish.save((err) => {
      if (err) {
        res.send(err);
      } else {
        User.findOne({
            _id: req.user._id
          })
          .populate('posts').exec((err, posts) => {
            console.log("Populated User " + posts);
          })
        res.render("post", {
          message: "Your Recipe is successfully posted."
        });
      }
    });
  });


app.get("/menu", function(req, res) {
  res.render("menu");
});


app.get('/auth/google',
  passport.authenticate('google', {
    scope: ["profile"]
  })
);

app.get('/auth/google/index', passport.authenticate('google', {
  failureRedirect: '/login'
}), function(req, res) {
  // Successful authentication, redirect home.
  res.redirect('/');
});

app.get("/logout", (req, res) => {
  req.logout();
  res.redirect('/');
});


app.route("/signup")
  .get((req, res) => {
    res.render("signup");
  })
  .post((req, res) => {
    User.register({
      username: req.body.username,
      name: req.body.name,
    }, req.body.password, (err, user) => {
      if (err) {
        console.log(err);
        res.redirect("/signup");
      } else {
        passport.authenticate("local")(req, res, () => {
          res.redirect('/');
        });
      }
    });
  })

app.route("/login")
  .get((req, res) => {
    res.render("login");
  })
  .post((req, res) => {
    const user = new User({
      username: req.body.username,
      password: req.body.password
    });
    req.login(user, (err) => {
      if (err) {
        console.log(err);
      } else {
        passport.authenticate("local")(req, res, () => {
          res.redirect("/");
        });
      }
    });
  })

app.listen(process.env.PORT || 5000, function() {
  console.log("server is running on port 5000");
});
EN

Stack Overflow用户

回答已采纳

发布于 2020-03-26 15:29:32

我相信你的问题在于:

代码语言:javascript
运行
复制
    dish.save((err) => {
      if (err) {
        res.send(err);
      } else {
        User.findOne({
            _id: req.user._id
          })
          .populate('posts').exec((err, posts) => {
            console.log("Populated User " + posts);
          })
        res.render("post", {
          message: "Your Recipe is successfully posted."
        });
      }
    });
  });

您使用populate作为更改dataset元素的函数,但它只是打印来自不同集合的结果的一个技巧,在根中,它们是不同的;如果希望它们位于同一个文档中,则必须使用子文档。populate不更改文档路径。

假设我没有输入任何错误,您必须纠正自己或让我知道,这应该解决您的问题;只需使用填充打印文件作为一个,而不是保存。

代码语言:javascript
运行
复制
app
  .route("/post")
  .get(function(req, res) {
    if (req.isAuthenticated()) {
      res.render("post", {
        message: ""
      });
    } else {
      res.redirect("/login");
    }
  })
  .post(upload.single("dishImage"), function(req, res, next) {
    const dishType = req.body.recipeGenre;
    const description = req.body.description;
    const dishName = req.body.dishName;
    const ingredient = req.body.ingredients;
    const step = req.body.steps;

    const username = req.body.author; //make sure this information is passed to req.body
    // const url = "https://polar-oasis-10822.herokuapp.com/recipes";
    const file = req.file;
    if (!file) {
      const error = new Error("Please upload a image");
      error.httpStatusCode = 400;
      return next(error);
    }
    // console.log(req.user);
    const dish = new Recipe({
      genre: dishType,
      name: dishName,
      description: description,
      ingredients: ingredient,
      method: step,
      imageName: file.filename
    });
    dish.save(err => {
      if (err) {
        res.send(err);
      } else {
        User.findOne({
          _id: req.user._id
        }).then(user => {//I have changed just here! I have eliminated the populate call
          user.posts.push(dish._id);
          user.save().then(() => {
            console.log("okay");
          });
        });

        res.render("post", {
          message: "Your Recipe is successfully posted."
        });
      }
    });
  });

由于您的代码很大,我可能遗漏了一些东西,请告诉我,如果我误解了您想要的内容。

参考资料

https://mongoosejs.com/docs/populate.html#refs-to-children

票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60867881

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档