2016-10-18 7 views
0

私はいくつかのコードを見ていますが、ユーザースキーマは次のようなものです。次のユーザーモデルの姓と名字にアクセスする方法(mongooseに基づいて)

var UserSchema = new mongoose.Schema(
    { 
     email: { 
      type: String, 
      lowercase: true, 
      unique: true, 
      required: true 
     }, 

     password: { 
      type: String, 
      required: true 
     }, 

     profile: { 
      firstName: { 
       type: String 
      }, 
      lastName: { 
       type: String 
      } 
     } 
    } 
); 

は今、私の知る限り理解できるよう、トップレベルのプロパティは、電子メール、パスワード、およびプロファイル.... firstNamelastNameだけprofile内からアクセスできる必要があります。しかし、詳細は次のようなものでアクセスされています。

exports.register = function(req, res, next) { 

    // Check for registration errors 
    const email = req.body.email; 
    const password = req.body.password; 
    const firstName = req.body.firstName; 
    const lastName = req.body.lastName; 

    // Return error if no email provided 
    if (!email) { 
    return res.status(422).send({ error: 'You must enter an email address.'}); 
    } 

    // Return error if no password provided 
    if (!password) { 
    return res.status(422).send({ error: 'You must enter a password.' }); 
    } 

    // Return error if full name not provided 
    if (!firstName || !lastName) { 
    return res.status(422).send({ error: 'You must enter your full name.'}); 
    } 

... 

私はfirstNamelastNamereq.body.firstNameの代わりreq.body.profile.firstNameに直接アクセスされている理由を理解していないようです。どちらの仮想属性も存在しないようです。どうしたの!?

+0

この登録ルートはどのように呼び出されますか?私はここでモンゴースが関わっているのを見ない。これは、POSTリクエストを介してデータを取得するルートのように見えます。 – DanielKhan

+0

FYI、 'passport'も使用されています。私はコードを投稿しませんでした。なぜなら、関連性があるとは思わないからです。とにかく、これも起こっている 'var authRoutes = express.Router(); authRoutes.post( '/ register'、AuthenticationController.register); '....ここで、' register'は上記のメソッドです。 – Grateful

+0

それに関係なく、 'req'はあなたの着信要求です。 このPOSTデータがどこに保存されている部分はどこですか? – DanielKhan

答えて

0

のように使用することのスキーマを使用するようなことがあり、次の形式を使用することをお勧めいたしますしたいと思います明示的なアプリケーション要求パラメータが経路(req, res, next)の第1パラメータとして渡される。ポストされたサンプルコードは、/ registerというルートへのPOSTリクエストの結果を示しています。 このデータは質問に投稿されたモデルに関連していません。

モデルを操作するには、データを新しいMongooseオブジェクトに格納する必要があります。 だから、ルート内の次のように記述します。ユーザー提供の変数を扱う際に

exports.register = function(req, res, next) { 
    const User = new User(); 
    User.profile.firstName = req.body.firstName; 
    // ... and so on 
    User.save((err, savedUser) => { 
     if(err) return next(err); 
     // end request 
    }); 
} 

は、健全性チェックのいくつかの種類が推奨されますのでご注意ください。上記の例のように使用することで、攻撃者はデータベース内に任意の長さの文字列を格納することができます。

1

@DanielKhanによって指摘されたように、上記のコメントの中で、mongooseはデータのモデル化にのみ使用されています。しかし、この時点では、クライアントから直接送られるデータとは何の関係もありません。したがって、電子メール、パスワード、名、姓などのすべてのフィールドは、req.bodyを使用して同じレベルで取得されます。

0

req.bodybody-parserで追加されました。これはあなたのマングースモデルとは関係ありません。フロントエンド(クライアント側)から送信されたreq.bodyのデータが得られます。別にこの問題から、私はあなたに

を助けるかもしれないあなたがsub-document

var profileSchema = new Schema({ 
    firstName: String, 
    lastName: String 
}); 

var UserSchema = new mongoose.Schema({ 
    email: { 
     type: String, 
     lowercase: true, 
     unique: true, 
     required: true 
    }, 

    password: { 
     type: String, 
     required: true 
    }, 

    profile: profileSchema 
}); 

とで

exports.register = function(req, res, next) { 

    if(!req.body) 
     return res.status(500).send({ error: 'Unable to parse data'}); 

    // Check for registration errors 
    const userData = { 
    email: req.body.email, 
    password: req.body.password, 
    profile: { 
     firstName: req.body.firstName, 
     lastName: req.body.lastName 
    } 
    } 

    // Return error if no email provided 
    if (!userData.email) { 
    return res.status(422).send({ error: 'You must enter an email address.'}); 
    } 

    // Return error if no password provided 
    if (!userData.password) { 
    return res.status(422).send({ error: 'You must enter a password.' }); 
    } 

    // Return error if full name not provided 
    if (!userData.profile.firstName || !userData.profile.lastName) { 
    return res.status(422).send({ error: 'You must enter your full name.'}); 
    } 

    var newUser = new User(userData);// you must import user schema before using User 
+0

Arifさんありがとうございます。 – Grateful

関連する問題