expressjs: как использовать функцию аутентификации в другом файле, прикрепленном к server.js ?

#javascript #html #node.js #express #login

#javascript #HTML #node.js #экспресс #аутентификация

Вопрос:

Представьте, что у меня есть следующий фрагмент кода в 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' amp;amp; 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:

Вы можете создать новый маршрутизатор, который имеет эту проверку и подключен к вашему приложению :

 authorizedRouter = express.Router();

authorizedRouter.use( checkAuth );

app.use( '/', authorizedRouter );

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

Просто будьте осторожны, где вы монтируете свой маршрутизатор. Если вы хотите смонтировать его в / своем приложении, вы должны поместить его после всех ваших app.get/app.post объявлений.

Комментарии:

1. Только один дополнительный вопрос. Таким образом, я использую ‘authorizedRouter’ вместо checkAuth в своих объявлениях app.get / app.post?

2. Подумайте о маршрутизаторе как о дополнительном приложении. Вы можете сделать authorizedRouter.get/.post(..) . Иногда может быть лучше использовать checkAuth на основе вашего объявления маршрутов. Маршрутизатор будет захватывать все маршруты, которые еще не были захвачены.

3. Аааа, теперь я понял! Большое спасибо! 🙂