Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/433.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 节点和Passport身份验证,挂起从客户端到服务器的请求_Javascript_Node.js_Express_Passport.js - Fatal编程技术网

Javascript 节点和Passport身份验证,挂起从客户端到服务器的请求

Javascript 节点和Passport身份验证,挂起从客户端到服务器的请求,javascript,node.js,express,passport.js,Javascript,Node.js,Express,Passport.js,我刚刚将Passport js包含在我的auth项目中。但是现在我的POST请求创建一个新的用户挂起,并在关闭服务器后在客户端返回一个警告,说“未授权”。我的旧代码(没有Passport)仍然有效,所以我认为从客户机到服务器的代理迁移不是问题 我看到的最后一个控制台日志是用户API中的第一个日志,console.log('received request',req.body) 没有记录的错误消息,除非在停止服务器时 “代理错误:无法将请求/api/用户从localhost:3000代理到http

我刚刚将Passport js包含在我的auth项目中。但是现在我的
POST
请求创建一个新的用户挂起,并在关闭服务器后在客户端返回一个警告,说“未授权”。我的旧代码(没有Passport)仍然有效,所以我认为从客户机到服务器的代理迁移不是问题

我看到的最后一个控制台日志是用户API中的第一个日志,
console.log('received request',req.body)

没有记录的错误消息,除非在停止服务器时

“代理错误:无法将请求/api/用户从localhost:3000代理到http://localhost:5000/. [1] 看https://nodejs.org/api/errors.html#errors_common_system_errors 有关更多信息(EconReset)。


passport.authenticate
在您的代码中不是作为中间件使用的,而是像在请求处理程序中调用的常规函数一样。到目前为止,当以这种方式使用时,您应该调用返回函数,如下所示:

passport.authenticate('register',(err,hashedPassword,info)=>{
// ...

})(req,res,next);//您不能在承诺中使用try-catch。您能删除try-catch并在承诺链的末尾添加一个
.catch(err=>done(err))
吗?很好,我做了更改,但它没有改变行为。甚至不记录
console.log('searging for User');
///app.js (server)

const express = require("express");
const bodyParser = require("body-parser");
const cors = require('cors');
const mongoose = require("mongoose");
const routes = require("./routes"); //Used to end with /api
const path = require("path");
require("dotenv").config();

const passport = require('passport');

const app = express();

const port = process.env.PORT || 5000;

//database
mongoose
  .connect(process.env.DB, { useNewUrlParser: true, useUnifiedTopology: true })
  .then(() => console.log("Database connected successfully"))
  .catch((err) => console.log(err));

mongoose.Promise = global.Promise;

app.use((req, res, next) => {
  res.header("Access-Control-Allow-Origin", "*");
  res.header(
    "Access-Control-Allow-Headers",
    "Origin, X-Requested-With, Content-Type, Accept"
  );
  next();
});

require('./config/passport');

app.use(cors());
app.use(bodyParser.json());
app.use(passport.initialize());

app.use("/", routes); //Load API - this folder has an index.js file

app.use((err, req, res, next) => {
  console.log("$!$", err);
  next();
});

app.listen(port, () => {
  console.log(`Server running on port ${port}`);
});

///users.js (API for User model)

const passport = require('passport');
const express = require("express");
const router = express.Router();
const User = require("../models/User");

//Old - This works, which makes me think the issue is with Passport js
// router.post("/user", (req, res, next) => {
//   try {
//     User.create(req.body)
//       .then((data) => res.json(data))
//       .catch(next);
//   } catch {
//     res.json({
//       error: "Failed to upload new user",
//     });
//   }
// });
//New
router.post("/user", (req, res, next) => {
  console.log('received request ', req.body);
  passport.authenticate('register', (err, hashedPassword, info) => {
    if (err) {
      console.log("Passport err on register ", err);
    }
    else if (info != undefined) {
      console.log("Defined err ", info.message);
      res.send(info.message);
    } else {
      req.login(user, err => {
        const newUser = {
          firstName: req.body.firstName,
          lastName: req.body.lastName,
          email: req.body.email,
          password: hashedPassword,
        };
        User.create(newUser)
          .then((data) => res.json(data))
          .catch(next);
      });
    }
  });
});
//passport.js (for auth)

const bcrypt = require('bcrypt');

const BCRYPT_SALT_ROUNDS = 12;

const passport = require('passport'),
      localStrategy = require('passport-local').Strategy,
      User = require('../models/User'),
      JWTstrategy = require('passport-jwt').Strategy,
      ExtractJWT = require('passport-jwt').ExtractJwt;

const opts = {
  jwtFromRequest: ExtractJWT.fromAuthHeaderWithScheme('JWT'),
  secretOrKey: 'secret key',
};

passport.use(
  'register',
  new localStrategy(
    {
      usernameField: 'email',
      passwordField: 'password',
    },
    (email, password, done) => {
      try {
        console.log('searching for User');
        User.findOne({ email })
          .then(user => {
          if (user != null) {
            console.log('email already taken');
            return done(null, false, { message: 'email already in use' });
          } else {
            console.log('email is available');
            bcrypt.hash(password, BCRYPT_SALT_ROUNDS).then(hashedPassword => {
              console.log('hashed password created for new user');
              return done(null, hashedPassword, null);
            });
          }
        })
      } catch(err) {
        done(err);
      }
    }
  )
)