【发布时间】:2021-03-24 19:34:41
【问题描述】:
const express = require('express');
const bcrypt = require('bcryptjs');
const passport = require('passport');
const { ensureAuthenticated } = require('../config/auth');
const router = express.Router();
//User/Post model
const User = require('../models/DBmusevista');
//Welcome/register page
router.get('/', (req, res) => res.render('register'));
//Login page
router.get('/login', (req, res) => res.render('login'));
//Home page
router.get('/home', ensureAuthenticated, (req, res) => res.render('home', {user_mv: req.user}));
//Create topic page
router.get('/create-topic', ensureAuthenticated, (req, res) => res.render('create-topic', {user_mv: req.user}));
//Register handle
router.post('/', (req, res) => {
const {firstname, lastname, username, email, password} = req.body;
let errors =[];
if(!firstname || !lastname || !username || !email || !password) {
errors.push({msg: 'Please check all fields.'});
};
//Check password length
if(password.length < 6) {
errors.push({msg: 'Password should be at least 6 characters.'});
};
if(errors.length > 0){
res.render('register', {
errors,
firstname,
lastname,
username,
email,
password
});
}else {
//Validation passed
User.findOne({email: email})
.then(user => {
if(user){
//User exists
errors.push({msg: 'Email is already registered.'})
res.render('register', {
errors,
firstname,
lastname,
username,
email,
password
});
} else {
const newUser = new User({ //Check User
firstname,
lastname,
username,
email,
password
});
//Hash password
bcrypt.genSalt(10, (err, salt) =>
bcrypt.hash(newUser.password,salt, (err, hash) => {
if(err) throw err;
//Set password to hash
newUser.password = hash;
//Save user
newUser.save()
.then(user => {
req.flash('success_msg', 'You are now registered and can now log in');
res.redirect('/login');
})
.catch(err => console.log(err));
}))
}
});
}
});
//Post handle
router.post('/create-topic', (req, res) => {
let newObj = {
title: req.body.title,
category: req.body.category,
vista: req.body.vista,
description: req.body.description
}
User.updateOne({username: user_mv.username}, { $set: {post: newObj}});
res.send('Hello');
//This is the code that does not work. Anything else I've tried has not worked.
});
//Login handle
router.post('/login', (req, res, next) => {
passport.authenticate('local', {
successRedirect: '/home',
failureRedirect: '/login',
failureFlash: true
})(req, res, next);
});
module.exports = router;
const mongoose = require('mongoose');
const DBmusevistaSchema = mongoose.Schema({
firstname: {
type: String,
required: false
},
lastname: {
type: String,
required: false
},
username: {
type: String,
required: false
},
email: {
type: String,
required: false
},
password: {
type: String,
required: false
},
date: {
type: Date,
default: Date.now
}
});
const DBmusevista = mongoose.model('DBmusevista', DBmusevistaSchema);
module.exports = DBmusevista;
当个人访问我的网站时,起始页 ('/') 是我网站的注册。我对我的 MongoDB 集合有一个发布请求,该请求创建了一个“用户注册”对象(fname、lname、username、email、pass)。一旦登录('/home'),用户就可以创建一个新的帖子表单,该表单位于我的 create-topic.ejs 文件('/create-topic')中。我是使用 MongoDB 的新手,所以我的问题是如何将提交的帖子(标题、类别、远景、描述)附加到用户对象的数组中。
我不确定是否应该向 DBmusevistaSchema 添加一个数组 (posts: []) 并在我的 DBmusevista 文件中创建一个 Post.Schema({key: value})?我尝试使用 User.findOne 但我无法让它工作。请帮忙。
【问题讨论】:
-
您是否希望帖子成为不同的集合,以便用户可以拥有 100 或 1000 条帖子并且您不想将所有帖子信息存储在用户集合中,而只是将 postIds 存储在用户集合中&当您想要帖子数据时,您会从帖子集合中查询它吗?或者,如果帖子数量非常少,您可以直接将整个帖子信息作为字段(数组或单个对象)直接存储在用户集合中!那你想做什么?
-
我熟悉mysql数据库和制作关系表。我不认为 MongoDB 是那样的。我认为 Mongo 不是关系数据库。我的意图是制作一个“帖子数组”并在该数组中存储 100 或 1000 篇帖子。我猜这是个坏主意?我该怎么做?如何查询用户和帖子以获得我想要的结果?
-
集合之间没有关系,除非您让您查询知道两个集合之间存在关系,只需使用 userID 查询用户集合,您就可以根据键(userID)从帖子集合中获取文档存储在帖子文档中(但所有插入用户或帖子集合的数据都是完全独立的)!!由您决定如何将数据存储到用户中,我不建议将 1000 个帖子对象存储在用户文档数组中,这会使用户文档变得庞大,因为用户收集至关重要(主登录页面数据)很简单..
-
这完全取决于您希望如何访问门户上的数据,1)也许您可以为每个帖子文档提供用户文档(用户 ID)的参考并快速获取用户的所有帖子, 2)而不是将整个(1000个)posts对象存储在一个数组中(或者也)将1000个posts文档键(posts ids)存储在一个数组中......考虑您的数据需求和设计好:-)
-
所以也许解决方案是:创建一个 Post 集合,然后为我的表单创建一个隐藏的输入字段并传递用户的 _id 作为值?