Javascript Express和Passport错误:身份验证策略未知“;“登录”;
我目前正在运行一个在线教程中的简单测试平均值堆栈,利用:Javascript Express和Passport错误:身份验证策略未知“;“登录”;,javascript,node.js,mongodb,express,passport.js,Javascript,Node.js,Mongodb,Express,Passport.js,我目前正在运行一个在线教程中的简单测试平均值堆栈,利用: Node.js Express.js Passport.js 以下是应用程序文件: app.js var express = require("express"); var mongoose = require("mongoose"); var path = require("path"); var bodyParser = require("body-parser"); var cookieParser = require("coo
- Node.js
- Express.js
- Passport.js
var express = require("express");
var mongoose = require("mongoose");
var path = require("path");
var bodyParser = require("body-parser");
var cookieParser = require("cookie-parser");
var session = require("express-session");
var flash = require("connect-flash");
var ejs = require("ejs");
var routes = require("./routes");
var app = express();
mongoose.connect("mongodb://localhost:27017/testdb");
app.set("port", process.env.PORT || 3000);
app.set("views", path.join(__dirname, "views"));
app.set("view engine", "ejs");
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(session({
secret: "secret",
resave: true,
saveUninitialized: true
}));
app.use(flash());
app.use(routes);
app.listen(app.get("port"), function() {
console.log("MEAN social media server started on port " + app.get("port"));
});
var express = require("express");
var passport = require("passport");
var User = require("./models/user");
var router = express.Router();
router.use(function(req, res, next) {
res.locals.currentUser = req.user;
res.locals.errors = req.flash("error");
res.locals.infos = req.flash("info");
next();
});
router.get("/", function(req, res,next) {
User.find()
.sort({ createdAt: "descending" })
.exec(function(err, users) {
if (err) {
return next(err);
}
res.render("index", { users: users });
});
});
router.get("/signup", function(req, res) {
res.render("signup");
});
router.post("/signup", function(req, res, next) {
var username = req.body.username;
var password = req.body.password;
User.findOne({ username: username }, function(err, user) {
if (err) {
return next(err);
}
if (user) {
req.flash("error", "User already exists");
return res.redirect("/signup");
}
var newUser = new User({
username: username,
password: password
});
newUser.save(next);
});
}, passport.authenticate("login", {
successRedirect: "/",
failureRedirect: "/signup",
failureFlash: true
}));
router.get("/users/:username", function(req, res, next) {
User.findOne({ username: req.params.username }, function(err, user) {
if (err) {
return next(err);
}
if (!user) {
return next(404);
}
res.render("profile", {
user: user
});
});
});
module.exports = router;
<% include _header %>
<h1>Sign up</h1>
<form action="/signup" method="post">
<input name="username" type="text" class="form-control" placeholder="Username" required autofocus>
<input name="password" type="password" class="form-control" placeholder="Password" required>
<input type="submit" value="Sign up" class="btn btn-primary btn-block">
</form>
<% include _footer %>
虽然此app.js文件中有视图,但此处的集中度是针对routes变量所需的路由:
routes.js
var express = require("express");
var mongoose = require("mongoose");
var path = require("path");
var bodyParser = require("body-parser");
var cookieParser = require("cookie-parser");
var session = require("express-session");
var flash = require("connect-flash");
var ejs = require("ejs");
var routes = require("./routes");
var app = express();
mongoose.connect("mongodb://localhost:27017/testdb");
app.set("port", process.env.PORT || 3000);
app.set("views", path.join(__dirname, "views"));
app.set("view engine", "ejs");
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(session({
secret: "secret",
resave: true,
saveUninitialized: true
}));
app.use(flash());
app.use(routes);
app.listen(app.get("port"), function() {
console.log("MEAN social media server started on port " + app.get("port"));
});
var express = require("express");
var passport = require("passport");
var User = require("./models/user");
var router = express.Router();
router.use(function(req, res, next) {
res.locals.currentUser = req.user;
res.locals.errors = req.flash("error");
res.locals.infos = req.flash("info");
next();
});
router.get("/", function(req, res,next) {
User.find()
.sort({ createdAt: "descending" })
.exec(function(err, users) {
if (err) {
return next(err);
}
res.render("index", { users: users });
});
});
router.get("/signup", function(req, res) {
res.render("signup");
});
router.post("/signup", function(req, res, next) {
var username = req.body.username;
var password = req.body.password;
User.findOne({ username: username }, function(err, user) {
if (err) {
return next(err);
}
if (user) {
req.flash("error", "User already exists");
return res.redirect("/signup");
}
var newUser = new User({
username: username,
password: password
});
newUser.save(next);
});
}, passport.authenticate("login", {
successRedirect: "/",
failureRedirect: "/signup",
failureFlash: true
}));
router.get("/users/:username", function(req, res, next) {
User.findOne({ username: req.params.username }, function(err, user) {
if (err) {
return next(err);
}
if (!user) {
return next(404);
}
res.render("profile", {
user: user
});
});
});
module.exports = router;
<% include _header %>
<h1>Sign up</h1>
<form action="/signup" method="post">
<input name="username" type="text" class="form-control" placeholder="Username" required autofocus>
<input name="password" type="password" class="form-control" placeholder="Password" required>
<input type="submit" value="Sign up" class="btn btn-primary btn-block">
</form>
<% include _footer %>
以下是views/signup.ejs文件:
查看/注册.ejs
var express = require("express");
var mongoose = require("mongoose");
var path = require("path");
var bodyParser = require("body-parser");
var cookieParser = require("cookie-parser");
var session = require("express-session");
var flash = require("connect-flash");
var ejs = require("ejs");
var routes = require("./routes");
var app = express();
mongoose.connect("mongodb://localhost:27017/testdb");
app.set("port", process.env.PORT || 3000);
app.set("views", path.join(__dirname, "views"));
app.set("view engine", "ejs");
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(session({
secret: "secret",
resave: true,
saveUninitialized: true
}));
app.use(flash());
app.use(routes);
app.listen(app.get("port"), function() {
console.log("MEAN social media server started on port " + app.get("port"));
});
var express = require("express");
var passport = require("passport");
var User = require("./models/user");
var router = express.Router();
router.use(function(req, res, next) {
res.locals.currentUser = req.user;
res.locals.errors = req.flash("error");
res.locals.infos = req.flash("info");
next();
});
router.get("/", function(req, res,next) {
User.find()
.sort({ createdAt: "descending" })
.exec(function(err, users) {
if (err) {
return next(err);
}
res.render("index", { users: users });
});
});
router.get("/signup", function(req, res) {
res.render("signup");
});
router.post("/signup", function(req, res, next) {
var username = req.body.username;
var password = req.body.password;
User.findOne({ username: username }, function(err, user) {
if (err) {
return next(err);
}
if (user) {
req.flash("error", "User already exists");
return res.redirect("/signup");
}
var newUser = new User({
username: username,
password: password
});
newUser.save(next);
});
}, passport.authenticate("login", {
successRedirect: "/",
failureRedirect: "/signup",
failureFlash: true
}));
router.get("/users/:username", function(req, res, next) {
User.findOne({ username: req.params.username }, function(err, user) {
if (err) {
return next(err);
}
if (!user) {
return next(404);
}
res.render("profile", {
user: user
});
});
});
module.exports = router;
<% include _header %>
<h1>Sign up</h1>
<form action="/signup" method="post">
<input name="username" type="text" class="form-control" placeholder="Username" required autofocus>
<input name="password" type="password" class="form-control" placeholder="Password" required>
<input type="submit" value="Sign up" class="btn btn-primary btn-block">
</form>
<% include _footer %>
注册
单击视图/signup.ejs文件上的提交按钮时,“用户”记录确实会提交到MongoDB数据库,但是插入后“/signup”post方法会出现以下错误:
localhost:3000/注册(POST)
错误:未知的身份验证策略“登录”
尝试时(//node_modules/passport/lib/middleware/authenticate.js:166:37)
在authenticate(//node_modules/passport/lib/middleware/authenticate.js:342:7)
在Layer.handle[作为handle\u请求](//node\u modules/express/lib/router/Layer.js:95:5)
下一步(//node_modules/express/lib/router/route.js:131:13)
在模型上。(//node_modules/mongoose/lib/document.js:1731:20)
下一步(//node_modules/hooks fixed/hooks.js:89:34)
在fnWrapper(//node_modules/hooks fixed/hooks.js:186:18)
在//node_modules/mongoose/lib/model.js:295:13
在//node_modules/mongoose/lib/model.js:230:5
在//node_modules/mongoose/lib/model.js:139:7
位于//node_modules/mongoose/node_modules/mongodb/lib/collection.js:479:5
位于//node_modules/mongoose/node_modules/mongodb/lib/collection.js:633:5
位于//node_modules/mongoose/node_modules/mongodb/lib/bulk/unordered.js:469:9
在resultHandler(//node_modules/mongoose/node_modules/mongodb/lib/bulk/unordered.js:416:5)
位于//node_modules/mongoose/node_modules/mongodb core/lib/topologies/server.js:778:13
在Callbacks.emit(//node_modules/mongoose/node_modules/mongodb core/lib/topologies/server.js:95:3)
我注意到,routes.js文件中的passport.authenticate函数没有对登录事件的引用
如果有人收到类似的“错误:未知身份验证策略”“登录”“错误”?我会选择删除这个问题,但因为我真诚地熬夜来解决这个问题,我至少应该发布错误是什么 在构建此应用程序时,创建了以下视图:
- index.ejs
- signup.ejs
谢谢大家的帮助。在router.js中
newUser.save(next);};},passport.authenticate(“login”),
你确定你可以这样做吗?我的意思是,在router.post()
?你正在做router.post('/',function(),function())
你的passport设置在哪里?@Diego这里的问题是我没有创建“login”面(或视图).@robertklep问题似乎是“登录”视图不可用。请参阅下面的答案。Passport对视图不感兴趣。您所犯的错误与您如何向Passport注册策略有关,我猜您也解决了这个问题。@robertklep从技术上讲,在发布问题报告时,我没有策略(后来,我要求使用“passport local”),所以这是绝对正确的。在实现了passport.use(“登录”)功能之后,它确实起了作用。感谢您的澄清。