Доступ к объекту jQuery в JADE - PullRequest
1 голос
/ 26 февраля 2012

Во время входа я сохраняю userId в файле cookie jQuery, чтобы я мог получить к нему доступ $.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 ]

14 голосов
/ 26 февраля 2012

Вы, кажется, неправильно поняли понятия.Позвольте мне дать вам лекцию.;)

Основы. Cookie хранится на стороне клиента.Таким образом, использование jQuery $.cookie('userId') приведет к его извлечению при запуске этого скрипта на стороне клиента.

Но здесь вы используете движок шаблонов JADE на стороне сервера.Таким образом, вы даже не отправили страницу на стороне клиента.Итак, какое печенье вы хотите получить?Файл 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. Если вам действительно нужно использовать файлы cookie (и вам не следует это делать, за исключением сеансов или 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-файле кажется бессмысленным.Конечный пользователь даже не должен знать свой собственный идентификатор.Сервер должен знать!Система сессий очень удобна.

Заключительное примечание. Код, который вы написали, показывает нам, что вы не можете различить серверный и клиентский JavaScript.Решение вашей проблемы - учиться, учиться и учиться.Прочитайте учебные пособия и все о JADE, Express и Node.js.

1 голос
/ 26 февраля 2012

То, что сказал @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 });

});
...