thomasp85 / fiery

A flexible and lightweight web server
https://fiery.data-imaginist.com
Other
240 stars 12 forks source link

Writing to the log in a loop, results in only the last 'i' being written N times. #39

Closed rasmusfm closed 4 years ago

rasmusfm commented 5 years ago

Writing to the log within a loop, results in the last value to be written 'N' times. I'm guessing this is because of the future evaluation, but I'm not sure how to get around it.

test_data <- data.frame(id = 1:5, data = LETTERS[1:5], stringsAsFactors = FALSE)
for (i in seq_len(nrow(test_data))) {
  message('Writing to log: ', jsonlite::toJSON(test_data[i, ]))
  server$log('test', jsonlite::toJSON(list(input = test_data[i, ])))
}

outputs:

Fire started at 127.0.0.1:8080
2019-02-26 13:53:01 - start: 127.0.0.1:8080
2019-02-26 13:53:01 - message: Writing to log: [{"id":1,"data":"A"}]
2019-02-26 13:53:01 - test: {"input":[{"id":5,"data":"E"}]}
2019-02-26 13:53:01 - message: Writing to log: [{"id":2,"data":"B"}]
2019-02-26 13:53:01 - test: {"input":[{"id":5,"data":"E"}]}
2019-02-26 13:53:01 - message: Writing to log: [{"id":3,"data":"C"}]
2019-02-26 13:53:01 - test: {"input":[{"id":5,"data":"E"}]}
2019-02-26 13:53:01 - message: Writing to log: [{"id":4,"data":"D"}]
2019-02-26 13:53:01 - test: {"input":[{"id":5,"data":"E"}]}
2019-02-26 13:53:01 - message: Writing to log: [{"id":5,"data":"E"}]
2019-02-26 13:53:01 - test: {"input":[{"id":5,"data":"E"}]}
2019-02-26 13:53:01 - message: 1
2019-02-26 13:53:01 - request: 127.0.0.1 - ID_127.0.0.1 [26/Feb/2019:13:53:01 +0100] "GET / HTTP/1.1" 200 48
2019-02-26 13:53:06 - message: Goodbye
2019-02-26 13:53:06 - stop: 127.0.0.1:8080

complete example based on the minimal fiery example:

library(fiery)

# Create a New App
app <- Fire$new()

app$set_logger(logger_console())

# Setup the data every time it starts
app$on('start', function(server, ...) {
  server$set_data('visits', 0)
  server$set_data('cycles', 0)
})

# Count the number of cycles (internal loops)
app$on('cycle-start', function(server, ...) {
  server$set_data('cycles', server$get_data('cycles') + 1)
})

# Count the number of requests
app$on('before-request', function(server, ...) {
  server$set_data('visits', server$get_data('visits') + 1)
})

# Handle requests
app$on('request', function(server, request, ...) {
  response <- request$respond()
  response$status <- 200L
  response$body <- paste0('<h1>This is indeed a test. You are number ', server$get_data('visits'), '</h1>')
  response$type <- 'html'
  test_data <- data.frame(id = 1:5, data = LETTERS[1:5], stringsAsFactors = FALSE)
  for (i in seq_len(nrow(test_data))) {
    message('Writing to log: ', jsonlite::toJSON(test_data[i, ]))
    server$log('test', jsonlite::toJSON(list(input = test_data[i, ])))
  }
  TRUE
})

# Show number of requests in the console
app$on('after-request', function(server, ...) {
  message(server$get_data('visits'))
  flush.console()
})

# Terminate the server after 50 cycles
app$on('cycle-end', function(server, ...) {
  if (server$get_data('cycles') > 50) {
    message('Ending...')
    flush.console()
    server$extinguish()
  }
})

# Be polite
app$on('end', function(server) {
  message('Goodbye')
  flush.console()
})

app$ignite(showcase = TRUE)