登录功能改造:展示服务端返回的自定义错误信息求助
Got it, let's fix this so you can display dynamic, server-specific error messages instead of that hardcoded text. Here's a step-by-step breakdown of what to adjust in each file:
Step 1: Pass Server Error Messages from Passport Strategy
First, we need to capture the error message returned by your validation server and pass it through Passport's authentication flow. We'll also add a mapping to convert raw server messages into user-friendly prompts. Update your passport.js file like this:
var LocalStrategy = require('passport-local').Strategy; var pg = require('pg'); var path = require('path'); var fs = require('fs'); var Client = require('node-rest-client').Client; var client = new Client(); // Map raw server messages to user-friendly prompts const errorMessageMap = { "Invalid email": "Please enter Valid email", "Invalid password": "Please enter Correct Password" }; module.exports = function(passport){ passport.use('login', new LocalStrategy({ passReqToCallback : true }, function(req, username, password, done) { var client = new Client(); client.get(serverHost+serverRoot+"/validateuser?username="+username+"&password="+password, function (data, response) { console.log("response from server ", data); if(data.result == "true"){ return done(null, username); } else { // Use the mapped message, or fall back to default if unknown const userFriendlyMessage = errorMessageMap[data.message] || "Please enter valid credentials"; // Pass the error message to Passport's failure flow return done(null, false, { message: userFriendlyMessage }); } }); })); }
Step 2: Add Flash Middleware to Carry Errors
We'll use connect-flash to store the error message in the session so it persists through the redirect. First, install the package:
npm install connect-flash
Then update app.js to include the flash middleware (make sure it comes after express-session):
var express = require('express'); var path = require('path'); var logger = require('morgan'); var bodyParser = require('body-parser'); var session = require('express-session'); var passport = require('passport'); var flash = require('connect-flash'); // Add this line var initPassport = require('./passport'); initPassport(passport); var routes = require('./routes/routes'); var authenticate = require('./routes/authenticate')(passport); // Configure session (ensure this exists before flash middleware) app.use(session({ secret: 'your-secure-secret-key', // Replace with your actual secret resave: false, saveUninitialized: false })); app.use(flash()); // Enable flash message storage app.use(passport.initialize()); app.use(passport.session()); app.use('/',routes); app.use('/auth',authenticate); // Set up view engine for dynamic templates app.set('view engine', 'ejs'); app.set('views', path.join(__dirname, 'views'));
Step 3: Update Authentication Route to Use Flash
Modify authenticate.js to tell Passport to flash the error message when login fails:
var express = require('express'); var router = express.Router(); var path = require('path'); module.exports = function(passport) { router.get('/logout', function(req, res){ req.logout(); res.redirect('/'); }); router.post('/login',passport.authenticate('login',{ successRedirect: '/', failureRedirect: '/relogin', failureFlash: true // Enable flash for failure messages })); return router; };
Step 4: Display the Dynamic Error in the Relogin Page
Static HTML can't access session variables, so convert your relogin page to an EJS template (rename relogin.html to relogin.ejs in your views folder) and add code to show the flash message:
<body> <div class="col-md-6 offset-3"> <!-- Show error message if it exists --> <% if (message) { %> <div class="alert alert-danger mb-4"><%= message %></div> <% } %> <form action="/auth/login" method="post" > <div class="form-group mb-4 mt-4"><input id="email" class="form-control form-control-rounded" type="text" name = "username" placeholder="Username" ></div> <div class="form-group mb-4 mt-4"><input id="password" class="form-control form-control-rounded" type="password" name="password" placeholder="Password"></div> <button type = "submit" value = "Login" class="btn btn-rounded btn-primary btn-block mt-2">Sign In</button> </form> </div> </body>
Finally, update your /relogin route in routes.js to render the EJS template and pass the flash message:
router.get('/relogin', function(req, res) { // Pass the flash error message to the template res.render('relogin', { message: req.flash('error')[0] }); });
That's it! Now when a user enters invalid credentials, the server's specific error message will be converted to a user-friendly prompt and displayed on the relogin page instead of the hardcoded text.
内容的提问来源于stack exchange,提问作者Kotha Praneeth Sai

