2017-02-16 14 views
0

私はフォーラムを作成しています。ユーザがログインして投稿を投稿しています。私はmongooseを使って投稿を保存しています。ユーザーが別の投稿を公開するとmongodbが生成されますユーザーが公開するすべての投稿の同じObjectID、およびユーザーがログアウトして戻るときに、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

問題を特定するのに十分なコードがありませんが、私が指摘しておきたいことは、そのsavePostメソッドを設定するスペースを無駄にしていることです。タイムスタンプはすべてMongooseのタイムスタンプオプションを設定するだけで完了でき、残りはコンストラクタに情報を渡すことで実行できます。 – Paul

+0

@Paulありがとうございました、ギターをどうですか、そこにあるすべてのコード – laoqiren

+0

おそらくhttps://github.com/laoqiren/isomorphic-redux-forum/tree/master/server – laoqiren

答えて

1

[OK]を、ええ、問題は、あなたがしているということです1つの新しい投稿を作成するだけです。

./api/addPost.jsには、const postEntity = new Post()を指定します。これは1回呼び出され(最初にファイルが必要またはインポートされる)、その後のすべての使用で同じ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を採用すべきです)、より良い再利用のために。

+0

ありがとう、お返事ありがとうございます私は学校に戻ることに忙しいので、あなたはとても遅いです。 – laoqiren

+1

ありがとう、これがまさにその理由です – laoqiren

関連する問題