Javascript 节点和Passport身份验证,挂起从客户端到服务器的请求
我刚刚将Passport js包含在我的auth项目中。但是现在我的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
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);
}
}
)
)