2016-10-18 1 views
0

다음과 비슷한 사용자 스키마가있는 코드를보고 있습니다.다음 사용자 모델의 성 및 이름에 액세스하는 방법 (몽구스 기준)?

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 
      } 
     } 
    } 
); 

는 지금까지 내가 이해할 수있는 최상위 속성은 이메일, 비밀번호 및 프로파일 .... firstNamelastNameprofile 내에서 액세스 할 수 있어야합니다. 그러나 세부 사항은 다음과 같이 액세스됩니다. firstNamelastNamereq.body.firstName 대신 req.body.profile.firstName에 직접 액세스하는 이유

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.'}); 
    } 

... 

이해하지 못하는 것 같습니다. 가상 속성도 존재하지 않는 것 같습니다. 그래서 무슨 일이야!?

+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

관련 문제