Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/442.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript I';当我的React和节点服务器不同(Firebase)时,我的Passport有问题,但当它们相同时,就没有问题(Heroku)_Javascript_Node.js_Reactjs_Firebase_Passport.js - Fatal编程技术网

Javascript I';当我的React和节点服务器不同(Firebase)时,我的Passport有问题,但当它们相同时,就没有问题(Heroku)

Javascript I';当我的React和节点服务器不同(Firebase)时,我的Passport有问题,但当它们相同时,就没有问题(Heroku),javascript,node.js,reactjs,firebase,passport.js,Javascript,Node.js,Reactjs,Firebase,Passport.js,我已经使用heroku部署了我的React应用程序,Passport可以很好地进行身份验证,但是当我使用Firebase托管和功能时,我遇到了一些无法解决的问题。 登录我的应用程序会刷新页面,该页面会调用一个useffect钩子来检查用户是否已登录 const handleAdminLogin = async (username, password, e) => { e.preventDefault(); await ADMIN.login(username, passwo

我已经使用heroku部署了我的React应用程序,Passport可以很好地进行身份验证,但是当我使用Firebase托管和功能时,我遇到了一些无法解决的问题。 登录我的应用程序会刷新页面,该页面会调用一个
useffect
钩子来检查用户是否已登录

const handleAdminLogin = async (username, password, e) => {
    e.preventDefault();
    await ADMIN.login(username, password).then((res) => {
      if (res.status === 200) {
        console.log(res);
        window.location.reload();
      }
    });
  };

  useEffect(() => {
    ADMIN.getUser().then((res) => {
      console.log("success");
      if (res) {
        setUser({
          id: res.data.id,
          loggedIn: true,
        });
      }
    });
  }, []);
服务器发送状态200,因此接收请求时没有错误

login: function (req, res, next) {
    passport.authenticate("local", (err, user, info) => {
      if (err) throw err;
      if (!user) res.sendStatus(401);
      else {
        req.logIn(user, (err) => {
          if (err) throw err;
          res.sendStatus(200);
        });
      }
    })(req, res, next);
  },
module.exports = function (passport) {
  passport.use(
    // eslint-disable-next-line new-cap
    new localStrategy((username, password, done) => {
      User.findOne({ username: username }, (err, user) => {
        if (err) throw err;
        if (!user) return done(null, false);
        bcrypt.compare(password, user.password, (err, result) => {
          if (err) throw err;
          if (result === true) {
            return done(null, user);
          } else {
            return done(null, false);
          }
        });
      });
    })
  );

  passport.serializeUser((user, cb) => {
    cb(null, user.id);
  });
  passport.deserializeUser((id, cb) => {
    User.findOne({ _id: id }, (err, user) => {
      const userInformation = {
        username: user.username,
      };
      cb(err, userInformation);
    });
  });
};
但这就是它停止的地方。函数getUser没有得到响应。 我知道在这种情况下我没有正确地处理错误,所以关于这方面的建议可能也会有所帮助

getUser: function (req, res) {
    if (req.user) {
      User.findOne({ username: req.user.username }).then((dbUser) => {
        res.send({
          id: dbUser._id,
          username: dbUser.username,
        });
      });
    }
  },
我相信我的axios呼叫具有正确的标题:

const URL = "https://us-central1-foothill-fitness.cloudfunctions.net/app";

const headers = {
  "Access-Control-Allow_Origin": "https://foothillfitness.com",
  "Content-Type": "application/json",
};

export default {
  // Gets user info
  getUser: function () {
    return axios.get(
      `${URL}/admin/user`,
      { withCredentials: true },
      { headers: headers }
    );
  },

  // Log the user in
  login: function (username, password) {
    return axios.post(
      `${URL}/admin/user/login`,
      { username, password },
      { withCredentials: true },
      { headers: headers }
    );
  },
我的passport中间件也可能导致问题,但在本地运行服务器时,我没有发现任何错误

login: function (req, res, next) {
    passport.authenticate("local", (err, user, info) => {
      if (err) throw err;
      if (!user) res.sendStatus(401);
      else {
        req.logIn(user, (err) => {
          if (err) throw err;
          res.sendStatus(200);
        });
      }
    })(req, res, next);
  },
module.exports = function (passport) {
  passport.use(
    // eslint-disable-next-line new-cap
    new localStrategy((username, password, done) => {
      User.findOne({ username: username }, (err, user) => {
        if (err) throw err;
        if (!user) return done(null, false);
        bcrypt.compare(password, user.password, (err, result) => {
          if (err) throw err;
          if (result === true) {
            return done(null, user);
          } else {
            return done(null, false);
          }
        });
      });
    })
  );

  passport.serializeUser((user, cb) => {
    cb(null, user.id);
  });
  passport.deserializeUser((id, cb) => {
    User.findOne({ _id: id }, (err, user) => {
      const userInformation = {
        username: user.username,
      };
      cb(err, userInformation);
    });
  });
};
还有一些我输入的服务器端代码,试图消除一些CORS错误:

app.use(
  cors({
    origin: "http://localhost:3000", // "https://foothillfitness.com", // <-- location of the react app were connecting to
    credentials: true,
  })
);

app.use("*", function (req, res, next) {
  // res.header("Access-Control-Allow-Origin", "https://foothillfitness.com");
  res.header("Access-Control-Allow-Headers", "X-Requested-With");
  res.header("Access-Control-Allow-Headers", "Content-Type");
  res.header("Access-Control-Allow-Methods", "PUT, GET, POST, DELETE, OPTIONS");
  res.header("Access-Control-Allow-Credentials", true);
  next();
});

// enable pre-flight
app.options("*", cors());
app.use(
科尔斯({

来源:“http://localhost:3000", // "https://foothillfitness.com“,//您在使用axios发送的标题中有一个输入错误。访问控制中有一个下划线-Allow\u Origin。将此更改为破折号,看看这是否解决了问题

关于错误处理,您可以添加
.catch
else
,如下所示:

getUser:function(请求、恢复){
如果(请求用户){
User.findOne({username:req.User.username})。然后((dbUser)=>{
res.send({
id:dbUser.\u id,
用户名:dbUser.username,
});
}).catch(错误=>{
抛出新错误(err)
});
}否则{
抛出新错误(“未提供用户”)
}

}
感谢您对此的回复!不幸的是,这并没有解决我的问题。由于添加了错误处理,我现在在控制台中收到一个状态代码500。您能分享错误吗?如果是来自
。catch
的话,问题是与mongodbIt的连接出现了新的错误,因此很可能就是这种情况
createError.js:16未捕获(承诺中)错误:请求失败,XMLHttpRequest.handleLoad(xhr.js:62)的结算(结算.js:17)处的createError(createError.js:16)处的状态代码为500
但是,我还有其他调用正在工作。只是Passport的设置方式不正确,或者这个特定调用不正常。这里弹出另一个错误
xhr.js:177 GEThttps://us-central1-foothill-fitness.cloudfunctions.net/app/admin/用户500
我试图复制此内容,但失败。请检查您与mongodb的连接