expressjs:如何在附加到server.js的另一个文件中使用身份验证功能?

时间:2016-10-13 07:35:47

标签: javascript html node.js express login

想象一下,我在server.js中有以下代码

function checkAuth(req, res, next) {
    if (!req.session.user_id) {
        res.sendFile(__dirname + '/login.html');
    } else {
        next();
    }
}
app.get('/', (req, res) => {
    res.sendfile(__dirname + 'login.html');
});
app.post("/login", (req, res) => {
    if (req.body.userID === 'a' && req.body.password === 'b') {
        req.session.user_id = req.body.userID;
        res.redirect('main');
    } else {
        res.redirect('/');
    }
});
app.get('/main', checkAuth, (req, res) => {
    res.sendFile(__dirname + '/main.html');
});
app.get('/logout', (req, res) => {
    delete req.session.user_id;
    res.redirect('/');
});

require('./latestNews.js')(app);
require('./featuredNews.js')(app);

app.get('*', (req, res) => {
    res.sendFile(__dirname + '/404.html');
});
app.listen(port, () => {
    console.log("listening on " + port);
});

用户将首先看到登录页面。登录后,他可以看到主页面。函数 checkAuth 用于app.get('/ main',...以实现此目的。

我附上了另外两个文件latestNews.js和featuredNews.js。这些还包括app.get,app.post,...函数,看起来像这样:

module.exports = function(app){
    app.get("/latestNews", (req, res) => {
        res.sendFile(__dirname + '/latestNews.html');
    });
}

因此将它们导出为模块并添加到server.js中,如下所示:

require('./latestNews.js')(app);
require('./featuredNews.js')(app);

我创建了一个server.js,latestNews.js和featuredNews.js,以便分离工作并保持代码短而不是一个长文件。

我的问题现在如下:

如何将'checkAuth'函数传递给latestNews.js和featuredNews.js所以我可以像这样使用它?

app.get("/latestNews", checkAuth (req, res) => {
    res.sendfile(__dirname + '/latestNews.html');
});

1 个答案:

答案 0 :(得分:1)

您可以创建一个具有此检查并已安装到您的应用的新路由器:

authorizedRouter = express.Router();

authorizedRouter.use( checkAuth );

app.use( '/', authorizedRouter );

require('./latestNews.js')(authorizedRouter);
require('./featuredNews.js')(authorizedRouter);

在安装路由器的地方要小心。如果您要将其安装在应用的/,则应将其放在所有app.get/app.post声明之后。