在JADE中访问jQuery对象

时间:2012-02-26 16:31:17

标签: node.js haml express pug

在登录期间,我将userId保存在jQuery cookie中,以便我可以$.cookie('userId')访问它。

现在我正试图从Jade访问它,as,

- if ($.cookie('userId') === userId)

我收到错误

  

$未定义

如何访问Cookie?

我的代码:

- if (($.cookie('userId')) === userId)
                                                input(type='submit', value='Move')
                                            else
                                                input(type='submit', disabled, value='Move'')

2 个答案:

答案 0 :(得分:14)

你似乎误解了概念。我来给你讲课。 ;)

基础知识。 Cookie存储在客户端。因此,当在客户端运行此脚本时,使用jQuery $.cookie('userId')将检索它。

但是你在服务器端使用JADE模板引擎。所以你甚至没有把页面发送到客户端。那么你想要检索什么cookie?没有cookie,因为你在服务器上。

还有更多。运行$.cookie('userId')会抛出错误,因为您在服务器端。没有$个对象。并且不可能,因为你不能在服务器端使用jQuery(嗯,实际上你可以,但目前这是无关紧要的)。您是否在路线系统中定义了$对象?或者你定义了助手$?我不这么认为。

Express + JADE教程。现在让我给你一个简短的教程。假设您有一个视图(在app.js

app.get('/', function(req, res){
    res.render('index.jade', { code: 500 });
});

现在在index.jade中,您可以使用code作为变量。所以你可以这样编写你的index.jade

// some code
- if (code == 500)
    input(type='submit', disabledm, value='Move')
- else
    input(type='submit', value='Move')
// some code

现在它会起作用!如果预定义它们,也可以在模板中使用JavaScript函数。例如(在app.js

app.helpers({
    positive: function(no) { return no > 0; }
});

然后在index.jade模板中,您可以使用

- if (positive(-13))
    input(type="submit")

甚至将这两个概念结合起来

- if (positive(code))
    // do some stuff

要cookie还是不要cookie。如果你真的需要使用cookies(例如你不应该除了会话或CSRF),那么你需要使用客户端JavaScript。这意味着您需要添加(在jQuery之后)

script(src='my-path/my-script.js')

index.jade文件,然后像这样写my-script.js

$(document).ready(function() {
  if ($.cookie('userId') == userId) {
    // do something like append input to some holder
  }
});

但该解决方案存在一些问题。第一:什么是userId(平等的第二部分)?您需要在index.jade中预定义它。例如,使用

script
    var userId = #{ user.id };

并在您的路线中添加user个对象。第二:cookie是局部变量。设置它们需要额外的服务器代码,我不喜欢这些代码。这使得维护应用程序更加困难。最后:将用户的id存储在cookie中似乎毫无意义。最终用户甚至不必知道它自己的id。服务器需要知道!会话系统在这里很方便。

最后的注释。您编写的代码向我们表明您无法区分服务器端和客户端JavaScript。解决问题的方法是学习,学习和学习。阅读有关JADE,Express和Node.js的教程和所有内容。

答案 1 :(得分:1)

@freakish说的是对的。你正在尝试服务器端和客户端 如果设置了cookie,您应该可以在服务器上访问它,如此

app.use(express.cookieParser());

app.get('/', function(req, res){
   // index is jade template
   // local variable on jade template holds cookie value
   // use req.cookies.userid
   res.render('index', { userid: req.cookies.userid });

});