2017-04-06 7 views
0

私はMongooseを新しくしました。 私はMEANスタックを開発しています。ユーザー認証でリストを作成します。(Mongoose)このuser._idを含むPOSTデータにセッションからuser._idを取得する方法

(つまり、ユーザーはログインを登録し、作成、取得、更新、削除することができます)。

2つのスキーマを意味します。 'users'と 'tasks' 1対多関係:ユーザーは多くのタスクを持つことができ、多くのタスクはユーザーに属します。

これは、「タスクのスキーマをどのように見えるかです:

すべてのユーザーがアクセス権を持っている可能性がotherwhise私は、「所有者」属性としてuser._idが必要になりますCRUDメソッドを構築するために
const TaskSchema = new Schema({ 
     title:{ 
     type: String, 
     required: true 
     }, 
     owner:{ 
      type: Schema.Types.ObjectId, 
      ref:'User' 
     } 
    }); 

localStからuser._idになるだろう、フロントエンドで

  1. Angular2:タスクリストには、それは私は2つの選択肢が考えていたuser._idを取得するには、

    を更新を作成したり、タスクを削除しますユーザをログインさせ続けるために以前に格納されていたブラウザのオーケー。

    const user = localStorage.getItem( 'user');

    「タイトル」属性を送信するのと同じオブジェクトで送信します。 このオプションは、フロントエンドの誰もがIDを送信できないほど安全ではないと思います。

  2. セッションのバックエンドにある現在のuser._idを取得します。 (私はそれをやる方法を知っていません)。そして、POSTメソッド、このようなもので、新しいタスクオブジェクトに含める:第二の選択肢(前者が優れている場合を除く)、どのように撮影

.post('/task', function(req, res, next){ function(req, res, next){

var task = new Task({ 
    title: req.body.title, 
    owner : req.user._id  /// Does not do nothing 
}); 

if(!task.title){ 
    res.status(400); 
    res.json({ 
     "error":"Bad Data" 
    }); 
} else{ 
    task.save(task, function(err, task){ 
     if(err){ 
      res.send(err); 
     } 
     res.json(task); 
    }); 
} 

});

あなたはPOSTメソッドを構築しますか? 具体的には、セッションから現在のuser._idを取得し、新しいTaskオブジェクトを含めるにはどうすればよいですか?

すぐにあなたのご意見をお待ちしております。 ありがとうございます。

少し異なる

答えて

0

しかし:

ユーザーモデル:

var UserSchema = new mongoose.Schema({ 
    username: String, 
    password: String 
}); 

タスクモデル:編集して

同様
var text = req.body.text; 
var author = { 
    id: req.user._id, 
    username: req.user.username 
}; 

var newTask = {text: text, author: author}; 

Task.create(newTask, function(err, addedTask){ 
    // what you wanna do 
}); 

var taskSchema = mongoose.schema({ 
    text: String, 
    author: { 
     id: { 
      type: mongoose.Schema.Types.ObjectId, 
      ref: "User" 
     }, 
     username: String 
    } 
}); 

module.exports = mongoose.model("Task", taskSchema); 

ポストルートでタスクを作成します。 /あなたが置くことができる更新ルート(編集)と「checkTaskOwnership」ミドルウェアでルート(削除のためのメソッドのオーバーライド)を削除してから

Task.findByIdAndUpdate/Task.findByIdAndRemove 
+0

私はあなたの提案にちょうど従って、それは私と同じエラーを示しています:未定義のプロパティ '_id'を読むことができません –

0

私はあなたがユーザーの_idセッション中に保存するべきだと思います。セッションに_idを保存するには、passportを使用します。それは認証を本当にうまく処理し、認証に成功すると、ユーザーの資格情報がreq.userに格納されます。このreq.userはすべてのリクエストに含まれています。したがって、どのルートでも、req.userオブジェクトからユーザの_idを取得できます。あなたはフロントエンドからユーザーの_idを送る必要はありません。

このTask使用を節約しながら:

var task = new Task({ 
    title: req.body.title, 
    owner : req.user._id 
}); 

task.save(function(err){...}); 

読むPassportJS docmentationSessionAuthenticationに関する詳細な情報を取得します。

関連する問題