2017-05-19 2 views
0

나는이 흙 코드 가져 오기 사용하여 우편으로 페이지를 로그인 절차에 로그인 페이지에서 폼 데이터를 전달하기 위해 노력하고있어 :보내기 {} 빈 Node.js를에 퍼와 형태 "후"후

form(id="form-login") 
    input(type="text", name="email", value="", placeholder="Tu email") 
    br 
    input(type="password", name="password", value="", placeholder="Tu contraseña") 
    br 
    input(type="submit" value="Conectar") 
script. 
    const formLogin = document.querySelector('#form-login'); 
    const formData = new FormData(formLogin); 

    formLogin.addEventListener('submit', function(event) { 
     console.log('Form Data: ', formData); 
     event.preventDefault(); 
     fetch('/signin', { 
      method: 'POST', 
      body: formData 
     }) 
     .then(function(res) { 
      res.json(); 
     }) 
     .then(function(data) { 
      console.log(data) 
      localStorage.setItem('token', data.token) 
     }) 
    }); 

문제 추적 후 그것은이 console.log를 제공합니다.

Form Data: FormData {} 

또한 정의되지 않은 req.body입니다. 이 스크립트에 주석을 달고 action="/signin" and method="post"을 추가하여 양식을 보내면 작동하고 대답이 인쇄되지만 storage.setItem({ token: <token> })을 호출하면 Uncaught (in promise) TypeError: Cannot read property 'token' of undefined 을 반환합니다.이 스크립트가 데이터를 보내지 않는 이유가 궁금합니다 ... 알아낼 수 없습니다. ... 그래서 어떤 도움이 많이 apreciated됩니다.

로그인 완료 기능 : 미리

function signIn (req, res) {  
    if (!req.body.email) return res.status(200).send({message: 'No recibo el usuario'}) 

    User.findOne({ email: req.body.email }, (err, user) => { 

     if(err) return res.status(500).send({ message: err }) 
     if(!user) return res.status(404).render('login', { title: 'Intenta loguearte de nuevo' }) 

     user.comparePassword(req.body.password, (error, isMatch) => { 
      if (error) return res.status(500).send({ message: error }) 
      if (!isMatch) { 
       return res.redirect('login') 
      } else { 
       req.user = user 
       res.status(200).send({ 
        message: 'Te has logueado correctamente', 
        token: service.createToken(user) 
       }) 
       //$window.localStorage.setItem({token: service.createToken(user)}); // NO WORKS 
       return res.body = service.createToken(user) // TRYING THIS WITHOUT KNOWLEDGE ABOUT WHAT AM I DOING :O 
      } 
     })     
    }) 
} 

감사합니다. 첫째 .then res.json().... 주석 @ MichałSałaciński 제안으로

**** 편집 **** 는, 적어도 응답을 제공하지만, 아직 여기 hapenning 또한 희망, 더 나은 일을 제대로 배울 수 있도록하기 위해 무엇을 알아 보았하지 않습니다 누군가 정확하게 이런 일을하는 법을 설명 할 수 있습니다.

Response: body : ReadableStream 
locked : false 
__proto__ : Object 
bodyUsed : false 
headers : Headers 
__proto__ : Headers 
ok : true 
redirected : false 
status : 200 
statusText: "OK" 
type : "basic" 
+0

퍼그 사용 경험이 없습니다. 2 개의'then' 호출을 같은 식으로 연결하는 것이 정상입니까? –

+0

네, 약속이 스크립트 태그 안에 있다는 것을 알고있는 한,이 시점에서 pug와 충돌해서는 안됩니다. 예. 연결할 수 있습니다. 여기에서 문서를 확인하십시오 -> [link] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/then) –

답변

0

"send"이벤트 수신기에서 "new FormData"를 이동해야합니다. 또한 type = "submit"후에 쉼표가 누락되었습니다. 그러나 전체적으로 문제는 pug와 아무 관련이 없습니다.

form(id="form-login") 
    input(type="text", name="email", value="", placeholder="Tu email") 
    br 
    input(type="password", name="password", value="", placeholder="Tu contraseña") 
    br 
    input(type="submit",value="Conectar") 
script. 
    const formLogin = document.querySelector('#form-login'); 

    formLogin.addEventListener('submit', function(event) { 
    const formData = new FormData(formLogin); 

     console.log('Form Data: ', formData); 
     event.preventDefault(); 
     fetch('/signin', { 
      method: 'POST', 
      body: formData 
     }) 
     .then(function(res) { 
      res.json(); 
     }) 
     .then(function(data) { 
      console.log(data) 
      localStorage.setItem('token', data.token) 
     }) 
    }); 
+0

저에게 맞지 않습니다 누락 된 쉼표와 고정 된'const formData' 함수를 변경하지 않고 고정 된 채로 ... 그리고 누군가 선물 -1 ... 당신의 최고의 하루를 보내십시오. –

+1

그래, 질문을 완벽하게 유효하게 여기에서 downvoting 이상한입니다. 여전히 작동하지 않는다면 "return res.json();"을 반환하고 "body : formData"와 함께 사용하려고 시도하십시오 –

+0

Ok, 시도한 후 다음 응답 받기 : 'Response {type : "basic "URL"http://192.168.1.104:3000/signin ", 리디렉션 : 거짓, 상태 : (200), 확인 : 사실 ...} 몸 : (...) 가 bodyUsed : 거짓 헤더 을 : 헤더 __proto__ : 헤더 확인 : 사실 리디렉션 : 거짓 개 상태 : 하는 statusText : "OK" 유형 : "기본" URL : 응답 내부와 같은 "http://192.168.1.104:3000/signin"' 봐. '몸 : (...) __proto__ : 를 bodyUsed 대상 : 를 고정 ReadableStream FALSE '몸은 아무것도 아니다 –