Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js NodeJS,获取路由内登录用户的用户名_Node.js_Express_Mongoose_Passport.js_Body Parser - Fatal编程技术网

Node.js NodeJS,获取路由内登录用户的用户名

Node.js NodeJS,获取路由内登录用户的用户名,node.js,express,mongoose,passport.js,body-parser,Node.js,Express,Mongoose,Passport.js,Body Parser,我正在学习NodeJS,并且已经学习了一些制作东西的视频教程,以了解NodeJS和Express。它更多地转向了抄袭,因为很少有人解释,所以我试着用我学到的东西做我自己的东西,等等 使用PassportJS、ExpressJs和Mongoose制作一个简单的登录函数。 登录和其他功能正常,如果我在主app.js中使用以下命令定义用户名,我可以获取当前登录用户的用户名并显示它: app.get("/stuff", (req,res) => { res.render("stuff.ht

我正在学习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(“…”)
这个
stuff.js
文件中的
app.js
中的所有内容,但都没有用,所以删除了除express+routes之外的所有内容以重新开始

如何将在
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.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"});
            }
        });
    });
}));
app.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.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);
    });
}

据我所知,您正试图将您的用户名传递给服务器,最好是每个文件,包括您的路由器文件。为此,我使用app.js中的中间件来传递每个页面。或者您也可以在另一个页面中简单地实现passport实现,我想这可能是无用的

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

然后,当您尝试渲染时,可以在每个页面中使用currentUser。

我遇到了相同的问题,可能是在遵循相同的教程之后。。。 我发现app.js中需要的功能是:

app.get('*', function(req, res,next){
    res.locals.user = req.user || null;
    next();
})
它应该已经在app.js中了。现在,在所有其他页面中,您应该能够使用req.user.username