Сияющий cookie сеанса приложения не найден в первый раз - PullRequest
0 голосов
/ 19 октября 2019

Я использую куки в своем блестящем приложении. Но есть проблема в том, что после того, как cookie установлен в браузере и обновлена ​​страница, cookie сначала не найден. Вы можете увидеть это в примере приложения: после нажатия кнопки «Войти» устанавливается cookie со значением «admin». При нажатии кнопки «Обновить» наблюдатель запускает проверку файлов cookie дважды: в первый раз файл cookie не обнаруживается, только во второй раз файл cookie обнаруживается. Что не так с моей реализацией?

library(shiny)
library(shinyjs)

jsCode <- '
  shinyjs.getcookie = function(params) {
    var cookie = Cookies.get("id");
    if (typeof cookie !== "undefined") {
      Shiny.onInputChange("jscookie", cookie);
    }
  }
  shinyjs.setcookie = function(params) {
    Cookies.set("id", escape(params), { expires: 0.5 });
    Shiny.onInputChange("jscookie", params);
  }
  shinyjs.rmcookie = function(params) {
    Cookies.remove("id");
    Shiny.onInputChange("jscookie", "");
  }
  shinyjs.reload = function() {
    history.go(0);
  }
'


ui <- fluidPage(
  shinyjs::useShinyjs(),
  shinyjs::extendShinyjs(text = jsCode),
  tags$head(
    tags$script(src = "https://cdn.jsdelivr.net/npm/js-cookie@2/src/js.cookie.min.js")
  ),
  uiOutput("ui"),
  actionButton("login", "login"),
  actionButton("logout", "logout"),
  actionButton("reload", "reload page")
)

server <- function(input, output, session) {

    user <- reactiveVal(NULL)

    observe({
      output$ui <- renderUI({
        h1(paste0("Hello ", user()))
      })
    })

    observe({
      print("Checking for cookie")
      js$getcookie()
      print(input$jscookie)
      if (!is.null(input$jscookie) && input$jscookie != "") {
        print("Cookie found")
        user(input$jscookie)
      } else {
        print("No cookie found")
        user(NULL)
      }
    })

  observeEvent(input$login, {
    print("login")
    js$setcookie("admin")
  })

  observeEvent(input$logout, {
    print("logout")
    js$rmcookie()
  })

  observeEvent(input$reload, {
    print("refresh")
    js$reload()
  })
}

shinyApp(ui, server)

1 Ответ

1 голос
/ 21 октября 2019

Функция наблюдения запускается в первую очередь, когда ваша блестящая программа создает входную переменную jscookie. В этом случае jscookie по-прежнему NULL. Добавление js$getcookie() перед печатью input$jscookie не меняет этого, поскольку назначение происходит в конце вашего observer.

Второй запуск происходит после того, как вы применили функцию js$getcookie(). В этом случае печенье найдено.

Вы можете избежать двойного триггера, используя функцию observeEvent(...) и добавляя функцию getcookie() вне observer. Теперь функция выполняется перед выполнением наблюдателя.

js$getcookie()
  observeEvent(input$jscookie, {
    print("Checking for cookie")
    print(input$jscookie)
    if (!is.null(input$jscookie) && input$jscookie != "") {
      print("Cookie found")
      user(input$jscookie)
    } else {
      print("No cookie found")
      user(NULL)
    }
  })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...