Я вхожу в 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);
});
}