我正在撰写论坛,用户登录和发布帖子,我使用mongoose将帖子保存到mongodb,我发现当用户发布另一个帖子时,mongodb会为所有帖子生成相同的ObjectID用户发布的帖子,当用户注销并返回时,mongodb将生成新的ObjectID。
这是我的代码:
import mongoose from 'mongoose'
mongoose.Promise = global.Promise
import db from './db'
const PostSchema = new mongoose.Schema({
author:String,
title:String,
content:String,
time:{}
});
PostSchema.methods.savePost = function(post,cb){
const date = new Date();
const time = {
date: date,
year : date.getFullYear(),
month : date.getFullYear() + "-" + (date.getMonth() + 1),
day : date.getFullYear() + "-" + (date.getMonth() + 1) + "-" + date.getDate(),
minute : date.getFullYear() + "-" + (date.getMonth() + 1) + "-" + date.getDate() + " " +
date.getHours() + ":" + (date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes())
};
this.author = post.author;
this.title = post.title;
this.content = post.content;
this.time = time;
this.save(cb);
};
api:
postEntity.savePost(post,err=>{
if(err){
return res.status(500).end('server err')
} else {
console.log('publish successfully')
return res.status(200).end('success')
}
})
这是我的github中的所有代码:https://github.com/laoqiren/isomorphic-redux-forum/tree/master/server
答案 0 :(得分:1)
好的,是的,问题在于您只创建了一个新帖子。
在./api/addPost.js
中,您执行const postEntity = new Post()
。这将被调用一次(第一次需要或导入文件),然后相同的postEntity将用于所有后续使用。
相反,你可以这样写:
const jwt = require("jwt-simple");
import Post from '../Models/post';
export default function(req,res,next){
const token = req.body.access_token;
let name;
if(token){
try{
var decoded = jwt.decode(token,req.app.get('jwtTokenSecret'));
if(decoded.exp < Date.now()){
return res.end('token expired',401);
}
name = decoded.name;
} catch(err){
res.status(401);
return res.send('no token');
}
const post = new Post({
title: req.body.title,
content: req.body.content,
author: name,
discuss: []
});
post.save(err => {
if(err){
return res.status(500).end('服务器错误')
} else {
return res.status(200).end('发表文章成功')
}
})
} else {
return res.status(401).end('没有登录')
}
}
作为旁注,您可能应该将jwt到期检查从该路由处理程序中拉出并进入其自己的中间件(或者更好的是,采用Passportjs),以便更好地重用。