TypeError: res.end is not a function. In passport npm package
TypeError: res.end is not a function. In passport npm package
这是错误。我被困在里面了。看看这个..
TypeError: res.end is not a function
at allFailed (C:\Users\sam\OneDrive\desktop\WebDevPractice\secret-files\node_modules\passport\lib\middleware\authenticate.js:174:11)
at attempt (C:\Users\sam\OneDrive\desktop\WebDevPractice\secret-files\node_modules\passport\lib\middleware\authenticate.js:180:28)
at Strategy.strategy.fail (C:\Users\sam\OneDrive\desktop\WebDevPractice\secret-files\node_modules\passport\lib\middleware\authenticate.js:302:9)
at Strategy.authenticate (C:\Users\sam\OneDrive\desktop\WebDevPractice\secret-files\node_modules\passport-local\lib\strategy.js:75:17)
at attempt (C:\Users\sam\OneDrive\desktop\WebDevPractice\secret-files\node_modules\passport\lib\middleware\authenticate.js:366:16)
at authenticate (C:\Users\sam\OneDrive\desktop\WebDevPractice\secret-files\node_modules\passport\lib\middleware\authenticate.js:367:7)
at C:\Users\sam\OneDrive\desktop\WebDevPractice\secret-files\app.js:70:37
at C:\Users\sam\OneDrive\desktop\WebDevPractice\secret-files\node_modules\passport-local-mongoose\index.js:247:28
at processTicksAndRejections (internal/process/task_queues.js:97:5)
//请看注册路由
require('dotenv').config();
const bodyParser = require("body-parser");
const express = require("express");
const ejs = require("ejs");
const mongoose = require("mongoose");
const session = require("express-session");
const passport = require ("passport");
const passportLocalMongoose = require("passport-local-mongoose");
const app = express();
app.use(bodyParser.urlencoded({extended: true}));
app.use(express.static("public"));
app.set("view engine","ejs");
app.use(session({
secret : "thisIsMyLitlleSecret",
resave : false,
saveUninitialized : false
}));
app.use(passport.initialize());
app.use(passport.session());
console.log(process.env.API_KEY);
mongoose.connect("mongodb://localhost:27017/userDB" , { useNewUrlParser: true , useUnifiedTopology: true });
mongoose.set("useCreateIndex", true);
const userSchema = new mongoose.Schema({
email : String,
password : String
});
userSchema.plugin(passportLocalMongoose);
const User = mongoose.model("User",userSchema);
passport.use(User.createStrategy());
passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());
app.get("/", function(req,res){
res.render("home");
});
app.get("/login", function(req,res){
res.render("login");
});
app.get("/secrets", function(req,res){
if(req.isAauthenticated){
res.render("secrets");
}
else{
res.redirect("/login")
}
})
app.get("/register", function(req,res){
res.render("register");
});
app.post("/register", function(req,res){
User.register({username : req.body.username}, req.body.password, function(err, user){
if(err){
console.log(err);
res.redirect("/register");
}
else
passport.authenticate("local")(res,req,function(){
res.redirect("/secrets");
});
});
});
app.post("/login",function(req,res){
});
app.listen(3000,function(req,res){
console.log("Server running on port 3000!!");
});
//这是注册ejs页面
<%- include('partials/header') %>
<div class="container mt-5">
<h1>Register</h1>
<div class="row">
<div class="col-sm-8">
<div class="card">
<div class="card-body">
<!-- Makes POST request to /register route -->
<form action="/register" method="POST">
<div class="form-group">
<label for="email">Email</label>
<input type="email" class="form-control" name="username">
</div>
<div class="form-group">
<label for="password">Password</label>
<input type="password" class="form-control" name="password">
</div>
<button type="submit" class="btn btn-dark">Register</button>
</form>
</div>
</div>
</div>
<!-- <div class="col-sm-4">
<div class="card social-block">
<div class="card-body">
<a class="btn btn-block" href="/auth/google" role="button">
<i class="fab fa-google"></i>
Sign Up with Google
</a>
</div>
</div>
</div> -->
</div>
</div>
<%- include('partials/header') %>
如何解决?
通常护照是中间件。
app.post(‘/register’, passport.authenticate(‘local’), (req, res) => {
//
}
还有为什么在注册路由上没有登录?
你有一点错字,在你的代码中,“req”必须在“res”之前,这是你的代码:
passport.authenticate("local")(res,req,function(){
res.redirect("/secrets");
});
简单地交换你的请求和响应的位置,应该是 - (req, res),然后就可以了。应该是这样,看起来很相似,很难看出区别:
passport.authenticate("local")(req, res, function(){
res.redirect("/secrets");
});
这是错误。我被困在里面了。看看这个..
TypeError: res.end is not a function
at allFailed (C:\Users\sam\OneDrive\desktop\WebDevPractice\secret-files\node_modules\passport\lib\middleware\authenticate.js:174:11)
at attempt (C:\Users\sam\OneDrive\desktop\WebDevPractice\secret-files\node_modules\passport\lib\middleware\authenticate.js:180:28)
at Strategy.strategy.fail (C:\Users\sam\OneDrive\desktop\WebDevPractice\secret-files\node_modules\passport\lib\middleware\authenticate.js:302:9)
at Strategy.authenticate (C:\Users\sam\OneDrive\desktop\WebDevPractice\secret-files\node_modules\passport-local\lib\strategy.js:75:17)
at attempt (C:\Users\sam\OneDrive\desktop\WebDevPractice\secret-files\node_modules\passport\lib\middleware\authenticate.js:366:16)
at authenticate (C:\Users\sam\OneDrive\desktop\WebDevPractice\secret-files\node_modules\passport\lib\middleware\authenticate.js:367:7)
at C:\Users\sam\OneDrive\desktop\WebDevPractice\secret-files\app.js:70:37
at C:\Users\sam\OneDrive\desktop\WebDevPractice\secret-files\node_modules\passport-local-mongoose\index.js:247:28
at processTicksAndRejections (internal/process/task_queues.js:97:5)
//请看注册路由
require('dotenv').config();
const bodyParser = require("body-parser");
const express = require("express");
const ejs = require("ejs");
const mongoose = require("mongoose");
const session = require("express-session");
const passport = require ("passport");
const passportLocalMongoose = require("passport-local-mongoose");
const app = express();
app.use(bodyParser.urlencoded({extended: true}));
app.use(express.static("public"));
app.set("view engine","ejs");
app.use(session({
secret : "thisIsMyLitlleSecret",
resave : false,
saveUninitialized : false
}));
app.use(passport.initialize());
app.use(passport.session());
console.log(process.env.API_KEY);
mongoose.connect("mongodb://localhost:27017/userDB" , { useNewUrlParser: true , useUnifiedTopology: true });
mongoose.set("useCreateIndex", true);
const userSchema = new mongoose.Schema({
email : String,
password : String
});
userSchema.plugin(passportLocalMongoose);
const User = mongoose.model("User",userSchema);
passport.use(User.createStrategy());
passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());
app.get("/", function(req,res){
res.render("home");
});
app.get("/login", function(req,res){
res.render("login");
});
app.get("/secrets", function(req,res){
if(req.isAauthenticated){
res.render("secrets");
}
else{
res.redirect("/login")
}
})
app.get("/register", function(req,res){
res.render("register");
});
app.post("/register", function(req,res){
User.register({username : req.body.username}, req.body.password, function(err, user){
if(err){
console.log(err);
res.redirect("/register");
}
else
passport.authenticate("local")(res,req,function(){
res.redirect("/secrets");
});
});
});
app.post("/login",function(req,res){
});
app.listen(3000,function(req,res){
console.log("Server running on port 3000!!");
});
//这是注册ejs页面
<%- include('partials/header') %>
<div class="container mt-5">
<h1>Register</h1>
<div class="row">
<div class="col-sm-8">
<div class="card">
<div class="card-body">
<!-- Makes POST request to /register route -->
<form action="/register" method="POST">
<div class="form-group">
<label for="email">Email</label>
<input type="email" class="form-control" name="username">
</div>
<div class="form-group">
<label for="password">Password</label>
<input type="password" class="form-control" name="password">
</div>
<button type="submit" class="btn btn-dark">Register</button>
</form>
</div>
</div>
</div>
<!-- <div class="col-sm-4">
<div class="card social-block">
<div class="card-body">
<a class="btn btn-block" href="/auth/google" role="button">
<i class="fab fa-google"></i>
Sign Up with Google
</a>
</div>
</div>
</div> -->
</div>
</div>
<%- include('partials/header') %>
如何解决?
通常护照是中间件。
app.post(‘/register’, passport.authenticate(‘local’), (req, res) => {
//
}
还有为什么在注册路由上没有登录?
你有一点错字,在你的代码中,“req”必须在“res”之前,这是你的代码:
passport.authenticate("local")(res,req,function(){
res.redirect("/secrets");
});
简单地交换你的请求和响应的位置,应该是 - (req, res),然后就可以了。应该是这样,看起来很相似,很难看出区别:
passport.authenticate("local")(req, res, function(){
res.redirect("/secrets");
});