NodeJS, получение имени пользователя вошедшего в систему пользователя в рамках маршрута - PullRequest
0 голосов
/ 25 июня 2018

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

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Я столкнулся с той же проблемой, вероятно, после того, как прошел те же уроки ... Я обнаружил, что функция, которая вам нужна в app.js:

app.get('*', function(req, res,next){
    res.locals.user = req.user || null;
    next();
})

она должна быть уже в app.js,Теперь на всех остальных страницах вы сможете использовать req.user.username

0 голосов
/ 26 июня 2018

Насколько я понимаю, вы пытаетесь передать свое имя пользователя желательно каждому файлу, включая файл вашего маршрутизатора. Что я делаю для этого, чтобы использовать middleware в app.js для прохождения каждой страницы. Или вы можете просто реализовать реализацию паспорта на другой странице, что, я думаю, бесполезно.

app.use(function(req,res,next){
  res.locals.currentUser=req.user
  next()
}

Затем вы можете использовать use currentUser на каждой странице при попытке рендеринга.

...