2017-12-27 30 views
-2

エラー:送信後にヘッダーを設定できません。私は何度もそれを取得し、私は間違いを見つけたが、私は間違っていたので、この問題は嫌いです。 これは私のコードですエラー:送信後にヘッダーを設定できません。

const mongoose = require ("mongoose"); 
const Spec = require("./specialist"); 
const Person = require("./person"); 
const Company = require("./company"); 
const bcrypt = require("bcryptjs"); 

module.exports.findUser=function(username,callback){ 
    let query = {email_num:username}; 
    Spec.findOne(query,(err_spec,spec_user)=>{ 
     if(err_spec) throw err_spec; 
     if(!spec_user){ 
      Person.findOne(query,(err_person,person_user)=>{ 
       if(err_person) throw err_person; 
       if(!person_user){ 
        Company.findOne(query,(err_company,company_user)=>{ 
         if(err_company) throw err_company; 
         if(!company_user){ 
          return console.log("Error User Not Found"); 
         } 
         return callback(null,company_user); 
        }); 
       } 
       return callback(null,person_user); 
      }); 
     } 
     return callback(null,spec_user); 
    }); 
}; 
module.exports.comparePassword = function(candidatePassword, hash, callback){ 
    bcrypt.compare(candidatePassword, hash, (err, isMatch) => { 
    if(err) throw err; 
    callback(null, isMatch); 
    }); 
}; 
module.exports.saveToken = function(username,role,token,callback){ 
    let query = {email_num:username}; 
    let updateToken={updatedToken:token}; 
    if(role==="Person-User"){ 
     Person.findOneAndUpdate(query,updateToken,callback); 
    }else if(role==="Specialist-User"){ 
     Spec.findOneAndUpdate(query,updateToken,callback); 
    }else if(role==="Company-User"){ 
     Company.findOneAndUpdate(query,updateToken,callback); 
    }else{ 
     console.log("Something went goes wrong"); 
    } 

} 

3つのコレクションとそのファイルをすべて処理するために作成しました。 これは私のメインサーバーコードです。

また、私はすべてのリクエストにAjaxを使用しています。

$(function() { 
    $('.subForm').on('submit', function (e) { 
     $.ajax({ 
      type: 'post', 
      url: 'http://localhost:3000/users/spec/register', 
      data: $(this).serialize(), 
      success:function(data){ 
       if(data.success){ 
        location.href="http://localhost:3000/login" 
       }else{ 
        location.href="http://localhost:3000/signup" 
       } 
      } 
     }); 
     e.preventDefault(); 
    }); 

     $('.personAuth').on('submit', function (e) { 
      $.ajax({ 
       type: 'post', 
       url: 'http://localhost:3000/person/register', 
       data: $(this).serialize(), 
       success:function(data){ 
        if(data.success){ 
         location.href="http://localhost:3000/login" 
        }else{ 
         console.log("Chexav"); 
         location.href="http://localhost:3000/signup"; 

        } 
       } 
      }); 
      e.preventDefault(); 
     }); 
     $('.companyAuth').on('submit', function (e) { 
      $.ajax({ 
       type: 'post', 
       url: 'http://localhost:3000/company/register', 
       data: $(this).serialize(), 
       success:function(data){ 
        if(data.success){ 
         location.href="http://localhost:3000/login" 
        }else{ 
         location.href="http://localhost:3000/signup" 
        } 
       } 
      }); 
      e.preventDefault(); 
     }); 
     $('.logInForm').on('submit', function (e) { 
      $.ajax({ 
       type: 'post', 
       url: 'http://localhost:3000/users/authenticate', 
       data: $(this).serialize(), 
       success:function(data){ 
        console.log(data); 
        if(data.token){ 
         localStorage.setItem("Authorization",data.token); 
         $.ajax({ 
          type:'get', 
          url:'http://localhost:3000/users/user', 
          beforeSend: function(xhr){xhr.setRequestHeader('auth', localStorage.getItem("Authorization"));}, 
          success:location.href="http://localhost:3000/users/user" 
         }) 
        } 
       }  
      }); 
      e.preventDefault(); 
     }); 

    }); 

これは認証のルートです。テンプレートエンジンとして

const express = require("express"); 
const router = express.Router(); 
const Spec = require("../models/specialist"); 
const jwt = require("jsonwebtoken"); 
const config = require("../config/data"); 
const Model = require("../models/model"); 

    //Registration route 
    router.post("/spec/register",(req,res)=>{ 
     let date=new Date(); 
     let newUser = new Spec({ 
      name:req.body.spec_name, 
      email_num:req.body.spec_email, 
      password:req.body.spec_password, 
      role:"Specialist-User", 
      isActive:true, 
      created:date, 
      updatedToken:"JWT" 

     }); 
     if(newUser.password===req.body.spec_confirmPass){ 
      Spec.getUser(newUser.email_num,(error,user)=>{ 
       if(error) throw error; 
       if(!user){ 
        Spec.addUser(newUser,(err,user)=>{ 
         if(err){ 
          console.log("err"); 
          res.json({success:false,msg:"Somethings Went Wrong"}); 
         } else { 
          res.header("Content-Type","application/json"); 
          res.json({success:true,msg:"User Registered"}); 
         // res.redirect("/login"); 
         } 
        }); 
       }else{ 
        res.json({success:false,msg:"User Already Exists"}); 
       } 
      }); 
     }else{ 
      res.json({success:false,msg:"Password Not Confirmed"}); 
     } 
    }); 


    //Authentication route 
router.post('/authenticate', (req, res,next) => { 
     const email = req.body.email; 
     const password = req.body.password; 
     console.log("UserData"); 
     Model.findUser(email, (err, user) => { 
      console.log("UserData1"); 
      if(err) throw err; 
      if(!user){ 
      return res.json({success: false, msg: 'User not found'}); 
      } 
      Model.comparePassword(password, user.password, (err, isMatch) => { 
      console.log("UserData2"); 
      if(err) throw err; 
      if(isMatch){ 
       let payload={ 
       name:user.name, 
       email:user.email_num, 
       role:user.role, 
       deleted:user.deleted, 
       isActive:user.isActive, 
       created:user.created, 
       }; 
       let token = jwt.sign(payload,config.JWT_SECRET,{ 
        expiresIn:1440 
       }); 

       Model.saveToken(email,user.role,token,(err,success)=>{ 
        if(err) return err; 
        console.log("Success"); 
        // res.setHeader('Authorization',token); 
        // res.cookie('Authorization',token); 
        res.json ({ success: true, token: token }); 
        // res.redirect("https://stackoverflow.com/users/user"); 
       }); 


      } else { 
       return res.json({success: false, msg: 'Wrong password'}); 
      } 
     }); 
    }); 
// res.redirect("/user"); 
}); 

router.use(function(req, res, next) { 
    console.log(req.headers); 
    let token = req.body.token || req.headers['auth'] || req.query.token || req.cookies.Authorization; 
    // console.log(token); 
     if (token) { 
     jwt.verify(token, config.JWT_SECRET, function(err, decoded) {  
      if (err) { 
       console.log(err); 
      return res.json({ success: false, message: 'Failed to authenticate token.' });  
      } else { 
      req.decoded = decoded;  
      next(); 
      res.render("user"); 
      } 
     }); 

     } else { 
     return res.status(403).json({ 
      success: false, 
      message: 'No token provided.' 
     }); 

     } 
    }); 

router.get("/user", (req,res)=>{ 
    res.render("user"); 
}); 




module.exports = router; 

私は大丈夫登録すべてをHandlebars.Soを使用していますが、私は、サーバーを認証しようとしているとき、私はクッキーを使用することができることを知っているが、私が欲しい

Error: Can't set headers after they are sent.

をもたらしますそれを避けるために。 ご迷惑をおかけして申し訳ありません。ありがとうございました。

答えて

0

Error: Can't set headers after they are sent.

これは、クライアント側に複数の応答を送信していることを意味します。

私はちょうどこのようなあなたの最後のミドルウェアであなたのres.render("user");を削除する必要があると思う:

router.use(function(req, res, next) { 
    console.log(req.headers); 
    let token = req.body.token || req.headers['auth'] || req.query.token || req.cookies.Authorization; 
    // console.log(token); 
     if (token) { 
     jwt.verify(token, config.JWT_SECRET, function(err, decoded) {  
      if (err) { 
       console.log(err); 
      return res.json({ success: false, message: 'Failed to authenticate token.' });  
      } else { 
      req.decoded = decoded; 
      // Go next and delete res 
      next(); 
      // res.render("user"); 
      } 
     }); 

     } else { 
     return res.status(403).json({ 
      success: false, 
      message: 'No token provided.' 
     }); 

     } 
    }); 

はそれがお役に立てば幸いです。

+1

これらはすべてCtrl + CとCtrl + Vのエフェクトです。非常に高速で効果的な回答をいただきありがとうございます。)))))))))))))))))))))) –

関連する問題