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
以下是应用程序文件:

app.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
如果您查看上面的routes.js文件,当某人发布注册表单(router.post(“/signup”)时,passport.authenticate将发送用户自动注册“login”视图并将用户发送到根端点

被调用的“登录”状态不存在导致错误,因此出现以下消息:

错误:未知身份验证策略“登录”错误


谢谢大家的帮助。

在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(“登录”)功能之后,它确实起了作用。感谢您的澄清。