NodeJs + ExpressJs app路由奇怪的行为

时间:2015-06-18 21:42:51

标签: angularjs node.js express mongoose passport.js

我正在学习ExpressJS。到目前为止,我已经使用PassportJS设置了一个简单的todo应用程序和用户身份验证。我使用Mongoose作为存储库。网络上没有任何内容可以解释我在路线设置中看到的奇怪行为。

情景:

  • 当我点击获取/护照时,它会指向护照页面 (登录/注册)
  • 当我点击get / aslkdjf时,它会指向护照页面 用户未登录,否则将直接指向文件
    /public/index.html)<< li>
  • 当我点击get /它应该直接到护照页面,如果用户 没有登录,但它转到/public/index.html而不是 我的todo应用程序将失败,因为/ api / todos下的req.user.username是 undefiend

奇怪的是,当我删除router.get(&#39; / *&#39;,...配置时,我的应用仍会转到public / index.html,当我点击基本路径时#39; /&#39;,但不是当我点击&#39; / asdfa&#39;。

&#13;
&#13;
    ...
    
    function loggedIn(req, res, next) {
        if (req.user) {
            next();
        } else {
            res.redirect('/passport');
        }
    }

    var router = express.Router();
// passport ----------------------------------------------------------------
// get passport page
router.get('/passport', notLoggedIn, function(req, res) {
    res.sendfile('./public/passport.html');
});

// post login
router.post('/login', passport.authenticate('login', {
    successRedirect: '/',
    failureRedirect: '/passport',
    failureFlash: true
}));

// post registration
router.post('/signup', passport.authenticate('signup', {
    successRedirect: '/',
    failureRedirect: '/passport',
    failureFlash: true
}));

router.get('/logout', function(req, res) {
    req.session.destroy();
    req.logout();
    res.redirect('/');
});

// api ---------------------------------------------------------------------
// get all todos
router.get('/api/todos', function(req, res) {

    // use mongoose to get all todos in the database
    Todo.find({owner: req.user.username}, function(err, todos) {

        // if there is an error retrieving, send the error. nothing after res.send(err) will execute
        if (err)
            res.send(err)

        res.json(todos); // return all todos in JSON format
    });
});

// create todo and send back all todos after creation
router.post('/api/todos', function(req, res) {

    // create a todo, information comes from AJAX request from Angular
    Todo.create({
        owner: req.user.username,
        text : req.body.text,
        done : false
    }, function(err, todo) {
        if (err)
            res.send(err);

        // get and return all the todos after you create another
        Todo.find({owner: req.user.username}, function(err, todos) {
            if (err)
                res.send(err)
            res.json(todos);
        });
    });

});

// delete a todo
router.delete('/api/todos/:todo_id', function(req, res) {
    Todo.remove({
        _id : req.params.todo_id
    }, function(err, todo) {
        if (err)
            res.send(err);

        // get and return all the todos after you create another
        Todo.find({owner: req.user.username}, function(err, todos) {
            if (err)
                res.send(err)
            res.json(todos);
        });
    });
});

// application -------------------------------------------------------------
router.all('*', loggedIn);
router.get('/*', function(req, res) {
    res.sendfile('./public/index.html'); // load the single view file (angular will handle the page changes on the front-end)
});

    app.use('/', router);
    app.listen(3000);
    console.log("App listening on port 3000");
&#13;
&#13;
&#13;

有人可以向我解释发生了什么事吗?我想要实现的目的是让用户在未登录时将用户重新路由到登录页面,然后访问www.myapp.com /

1 个答案:

答案 0 :(得分:0)

显然问题是HTML默认在根目录下的任何文件夹中查找index.html文件。当我将html文件更改为其他类似abc.html时,问题就解决了。对我来说似乎是一个错误。