我要进入NodeJS,并按照一些视频教程进行制作,以了解NodeJS和Express。它更多地用于复制方面的解释,因此尝试使用我所学的知识来制作自己的东西。
使用PassportJS,ExpressJs和Mongoose进行简单的登录功能。 登录名和内容有效,如果我使用以下方法在主app.js中定义它,则可以获取当前登录用户的用户名并显示该用户名:
app.get("/stuff", (req,res) => {
res.render("stuff.html", {username:req.user.username});
});
现在,如果我想通过使用路由器来变得美观和结构化,我将无法使其正常工作。抛出错误,指出username
未定义,使页面无法呈现。如果我不传递任何变量或使用我知道可以使用的变量(例如var x = "Hello"; res.render … {msg:x});
),则路由器本身可以正常工作。
app.js
中处理路线的一部分:
var stuff = require("./routes/stuff");
app.use("/stuff", stuff);
module.exports.app;
我已经尝试cont x = require("…")
基本上app.js
中stuff.js
文件中的所有内容,但无济于事,因此删除了所有内容,但表达+路线以重新开始。
如何将app.js
中有效的用户名传递到路由文件中?最好使用app.get("*")…
或其他方式使其自动处理每个页面。
整个stuff.js
:
/* Routes */
const express = require("express");
const router = express.Router();
/* Stuff */
router.get("/", function(req, res, next) {
res.render("stuff.html", {username:req.user.username});
console.log(req.user.username);
next();
});
/* Bottom */
module.exports = router;
app.js
的登录部分:
app.post('/login',
passport.authenticate('local',
{
successRedirect: '/dashboard',
failureRedirect: '/login',
failureFlash: 'Wrong login'
}
), function(req,res) {
console.log("Hello " + req.user.username);
});
passport.serializeUser(function(user,done) {
done(null, user.id);
});
passport.deserializeUser(function(id,done) {
User.getUserById(id, function(err, user) {
done(err,user);
});
});
passport.use(new LocalStrategy(function(username,password,callback) {
User.getUserByUsername(username, function(err,user) {
if(err) throw err;
if(!user) {
return callback(null, false, {msg: "shit"});
}
User.comparePassword(password, user.password, function(err,isMatch) {
if(err) return callback(err);
if(isMatch) {
return callback(null, user);
} else {
return callback(null, false, {msg:"Something"});
}
});
});
}));
users.js
文件,用于处理注册新用户(如果相关的话):
const mongoose = require("mongoose");
mongoose.connect("mongodb://localhost/users");
const db = mongoose.connection;
mongoose.Promise = global.Promise;
const bcrypt = require("bcryptjs");
/* Data schema */
const userSchema = mongoose.Schema({
name: {
type: String
},
username: {
type: String,
index: true
},
password: {
type: String
},
email: {
type: String
}
});
var User = module.exports = mongoose.model("User", userSchema);
module.exports.createUser = function(newUser, callback) {
bcrypt.genSalt(10, function(err, salt) {
bcrypt.hash(newUser.password, salt, function(err, hash) {
newUser.password = hash;
newUser.save(callback);
});
});
}
module.exports.getUserById = function(id, callback) {
User.findById(id, callback);
}
module.exports.getUserByUsername = function(username, callback) {
var query = {username: username};
User.findOne(query, callback);
}
module.exports.comparePassword = function(testPw, hash, callback) {
bcrypt.compare(testPw, hash, function(err,isMatch) {
callback(null,isMatch);
});
}
答案 0 :(得分:0)
据我了解,您正在尝试将用户名传递给最好的每个文件,包括路由器文件。为此,我使用app.js中的中间件来传递每个页面。或者,您也可以在另一页中简单地实现护照实施,这可能没用。
app.use(function(req,res,next){
res.locals.currentUser=req.user
next()
}
然后,当您尝试渲染时,可以在每个页面中使用currentUser。
答案 1 :(得分:0)
我可能在遵循了相同的教程之后遇到了同样的问题... 我发现您在app.js中需要的功能是:
app.get('*', function(req, res,next){
res.locals.user = req.user || null;
next();
})
它应该已经在app.js中。现在,在其他所有页面中,您应该可以使用req.user.username