0

我有一个有效的用户注册/登录页面,唯一剩下的就是根据用户是否登录来制作内容。阅读后我想出了这个:

app.use(function(req, res, next) {
  db.users.find({rememberToken: req.cookies.rememberToken}, function(err, foundUser) {
    if (err) { next(); }

    if (foundUser[0].length === 0) {
      res.locals.isLoggedIn = false;
      next();
    } else {
      res.locals.isLoggedIn = true;
      next();
    }
  });
});

然后只是为了测试它,我在我的 Jade 模板中做了这个:

!!!
html
 head
  #{isLoggedIn()}

但所发生的只是它说 isLoggedIn 没有定义。

我找不到太多关于这个主题的文档,所以任何信息都会很棒。谢谢!

我基本上想让函数返回 true 或 false,以便我可以根据它加载内容。

4

2 回答 2

3

首先,要获得函数的结果,您必须调用该函数,而不是像您那样渲染元素。要调用该函数,请使用以下语法:

p #{isLoggedIn()}

要呈现 HTML/jade 的一部分,您可以使用类似

- if (isLoggedIn())
  p User is logged in

您的代码示例的真正问题是您正在从您的视图访问数据库,并且您正在从您的视图中使用一个回调(下一个),这将不起作用。一种更好的工作方式是使用一些中间件isLoggedIn在你的 res.locals 中设置一个字段。

var isLoggedIn = function(req, res, next) {
  db.users.find({rememberToken: req.cookie.rememberToken}, function(err, foundUser) {
    if (err) { console.log('We have an error ' + err ); next();}

    if (foundUser[0].length === 0) {
        console.log('We could not find the user with the rememberToken ' + req.cookie.rememberToken);
        res.locals.isLoggedIn = false;
        next();
    } else {
        console.log('We found the user with the rememberToken ' + req.cookie.rememberToken);
        res.locals.isLoggedIn = true;
        next();
    }
  });
};

app.get('/yourroute', isLoggedIn, routes.yourroute);
于 2013-04-07T07:01:48.223 回答
1

你可以让它工作:

!!!
html
 head
  | #{isLoggedIn()}

或者在条件语句中:

!!!
html
  head
  - if (isLoggedIn())
    // do something
  - else
    // do something else

但是为什么不创建isLoggedIn一个布尔变量而不是一个函数呢?我很确定从 Jade 调用异步函数是行不通的。

于 2013-04-07T06:50:15.577 回答