当前位置: 首页 > 知识库问答 >
问题:

将标头发送到客户端后,无法设置标头

司空福
2023-03-14

将标头发送到客户端后,无法对其进行设置。这是我的身份验证post请求后的后端错误。看起来标题有问题。我很抱歉我的项目肮脏的代码,我需要做一些别的事情,所以有一些代码在评论中。这是我的代码

const express = require("express");
const router = express.Router();
const Spec = require("../models/specialist");
const jwt = require("jsonwebtoken");
const config = require("../config/data");
const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;


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

    //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:"User",
            isActive:true,
            created:date,
            updatedToken:"JWT"

        });
        Spec.addUser(newUser,(err,user)=>{
            if(err){
                console.log("err");
              } else {
                res.header("Content-Type","application/json");
            //    res.redirect("/users/login");

              }
        });


    });

// passport.use(new LocalStrategy(
//     function(username, password, done) {
//      Spec.getUser(username, function(err, user){
//          if(err) return console.error(err.stack);
//          if(!user){
//              return done(null, false, {message: 'Unknown User'});
//          }

//          Spec.comparePassword(password, user.password, function(err, isMatch){
//              if(err) return console.error(err.stack);
//              if(isMatch){
//                  return done(null, user);
//              } else {
//                  return done(null, false, {message: 'Invalid password'});
//              }
//          });
//      });
//     }));

//   passport.serializeUser(function(user, done) {
//     done(null, user.id);
//   });

//   passport.deserializeUser(function(id, done) {
//     User.getUserById(id, function(err, user) {
//       done(err, user);
//     });
//   });

     //Authentication route
router.post('/spec/authenticate', (req, res,next) => {
        const email = req.body.email;
        const password = req.body.password;

        Spec.getUser(email, (err, user) => {
          if(err) throw err;
          if(!user){
            return res.json({success: false, msg: 'User not found'});
          }

          Spec.comparePassword(password, user.password, (err, isMatch) => {
            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
              })

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


            } else {
              return res.json({success: false, msg: 'Wrong password'});
            }
      });
   });
// res.redirect("/user");
 });
router.get("/user",passport.authenticate('jwt',{session:false}), (req,res)=>{

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


module.exports = router;

你可以在我的代码中找到其他错误,因为我尝试了许多不同的方法。以下是passport.js配置文件

const JwtStrategy = require('passport-jwt').Strategy,
ExtractJwt = require('passport-jwt').ExtractJwt;
const config = require("./data");
const mongoose = require("mongoose");
const User = require("../models/specialist");

module.exports = function(passport){
    let cookieExtractor = function(req) {
        var token = null;
        if (req && req.cookies)
        {
            token = req.cookies['Authorization'];
        }
        return token;
    };
    let opts = {}
    opts.jwtFromRequest = cookieExtractor;
    opts.secretOrKey = config.JWT_SECRET;
    passport.use(new JwtStrategy(opts, function(jwt_payload, done) {
        User.findOne({name:jwt_payload._doc.name}, function(err, user) {
            if (err) {
                console.log(err);
                return done(err, false);
            }
            if (user) {
                console.log("OK 200");
                return done(null, user);
            } else {
                console.log("no user");
                return done(null, false);
                // or you could create a new account
            }
        });
    }));
}


//   // Google OAuth Strategy
//   passport.use('googleToken', new GooglePlusTokenStrategy({
//     clientID: config.oauth.google.clientID,
//     clientSecret: config.oauth.google.clientSecret
//   }, async (accessToken, refreshToken, profile, done) => {
//     try {
//       // Should have full user profile over here
//       console.log('profile', profile);
//       console.log('accessToken', accessToken);
//       console.log('refreshToken', refreshToken);

//       const existingUser = await User.findOne({ "google.id": profile.id });
//       if (existingUser) {
//         return done(null, existingUser);
//       }

//       const newUser = new User({
//         method: 'google',
//         google: {
//           id: profile.id,
//           email: profile.emails[0].value
//         }
//       });

//       await newUser.save();
//       done(null, newUser);
//     } catch(error) {
//       done(error, false, error.message);
//     }
//   }));

//   passport.use('facebookToken', new FacebookTokenStrategy({
//     clientID: config.oauth.facebook.clientID,
//     clientSecret: config.oauth.facebook.clientSecret
//   }, async (accessToken, refreshToken, profile, done) => {
//     try {
//       console.log('profile', profile);
//       console.log('accessToken', accessToken);
//       console.log('refreshToken', refreshToken);

//       const existingUser = await User.findOne({ "facebook.id": profile.id });
//       if (existingUser) {
//         return done(null, existingUser);
//       }

//       const newUser = new User({
//         method: 'facebook',
//         facebook: {
//           id: profile.id,
//           email: profile.emails[0].value
//         }
//       });

//       await newUser.save();
//       done(null, newUser);
//     } catch(error) {
//       done(error, false, error.message);
//     }
//   }));

  // LOCAL STRATEGY
//   module.exports = function(passport){
//   passport.use(new LocalStrategy(
//     function(username, password, done) {
//      Spec.findOne({ username: username }, function (err, user) {
//         if (err) { return done(err); }
//         if (!user) { return done(null, false); }
//         if (!user.verifyPassword(password)) { return done(null, false); }
//         return done(null, user);
//       });
//     }
//   ));
// }

这是用于身份验证的 ajax 请求

$('.logInForm').on('submit', function (e) {
            $.ajax({
                type: 'post',
                url: 'http://localhost:3000/users/spec/authenticate',
                data: $(this).serialize(),
                success:function(data){
                    console.log(data);
                    localStorage.setItem("authToken",data.token);
                }    
            }).done(function(data){
                if(data.token){
                    location.href="http://localhost:3000/users/user";
                }else{
                    console.log("err");
                }
            });
            e.preventDefault();
        });

非常感谢。

共有1个答案

曹镜
2023-03-14

这是因为您的代码尝试从身份验证函数发送多个响应。

res.json ({ success: true, token: 'bearer ' + token }); // 1st Response
res.redirect("/users/user"); // 2nd Response

去掉其中一个你不用的。

 类似资料:
  • 问题内容: 将标头发送到客户端后,无法设置标头。这是请求验证后的后端错误,看起来像标头问题。我为我的项目脏代码感到抱歉,我还需要做其他事情,因此在注释中有一些代码。这是我的代码 您可以在我的代码中发现其他错误,因为我尝试了许多不同的方法。这是passport.js配置文件 这是身份验证的ajax请求 非常感谢你。 问题答案: 这是由于您的代码试图从authenticate函数发送多个响应。 删除其

  • 我在NodeJS中使用Passport.js、Express和Mongoose时遇到了这个奇怪的问题。基本上,即使我只发送了一个头,我还是得到一个错误,说“不能在头被发送到客户端后设置它们”。 我读过其他帖子并尝试过,但没有一个有效。 应用程序。get-res.send与return res.send之间有什么区别吗 错误[ERR_HTTP_HEADERS_SENT]:将标头发送到客户端后,无法设

  • 问题内容: 我对Node.js相当陌生,遇到了一些问题。 我正在使用Node.js 4.10和Express 2.4.3。 当我尝试访问http://127.0.0.1:8888/auth/facebook时,我将重定向到http://127.0.0.1:8888/auth/facebook_callback。 然后,我收到以下错误: 以下是我的代码: 我可以知道我的代码有什么问题吗? 问题答案:

  • 问题内容: 我对Node.js相当陌生,遇到了一些问题。 我正在使用Node.js 4.10和Express 2.4.3。 当我尝试访问http://127.0.0.1:8888/auth/facebook时,我将重定向至http://127.0.0.1:8888/auth/facebook_callback。 然后,我收到以下错误: 以下是我的代码: 我可以知道我的代码有什么问题吗? 问题答案:

  • 所以我看到了一篇很棒的帖子“错误:发送到客户端后无法设置标题,但仍然不明白我的“标题”部分有什么问题,因为当我将它从注释掉的

  • 我正在关注一个关于udemy上的节点.js的课程,这有点过时了,遇到了这些错误,我无法找到解决方案。 我尝试了什么: 使用next(); 在所有if语句中添加返回res 有人能帮我修一下这些吗?我将不胜感激! 提前感谢! 用户名存在错误:错误 [ERR_HTTP_HEADERS_SENT]:在服务器响应.set 上将标头发送到客户端后无法设置标头 (_http_outgoing.js:526:11