mongodb在保存数据时生成相同的ObjectID

时间:2017-02-16 02:20:43

标签: node.js mongodb mongoose

我正在撰写论坛,用户登录和发布帖子,我使用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

1 个答案:

答案 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),以便更好地重用。