8

我发现在为 Hunchentoot 编码时,增量开发往往会中断。

例如,我可能会编写一个由几个函数组成的网页。如果这些内部函数之一包含对 - 比如说 - hunchentoot:post-parameters* 的调用,那么我无法轻松地在 REPL 中测试该函数。它会出错,因为 *request* 不存在,除非该页面被 Web 客户端调用。

如果存在一些函数或其他源以便我可以测试我的函数,那就太好了:

>(let* ((*request* (get-previous-request-from-somewhere))
       (*session* (slot-value *request* 'hunchentoot:session)))
    (my-function <whatever params>))

它或类似的东西是否存在?我是否忽略了更好的调试方法?

4

2 回答 2

7

我的临时解决方案如下所示:

(defparameter *save-last-request* t)
(defvar *last-request* nil)

(defun store-request ()
  (when *save-last-request*
    (setf *last-request* *request*)))

(defmacro with-last-request (&body body)
  `(let* ((*request* *last-request*)
      (*session* (slot-value *request* 'hunchentoot:session)))
    ,@body))

它适用于每个处理程序需要调用的警告store-request

于 2014-04-23T01:23:47.573 回答
1

我认为最简单的做法可能是使用自定义请求类,该类引入了一种将请求持久化到初始化程序链中的方法。

这是一种方法的简单示例。请求的自定义子类,将其状态保存在全局堆栈中。

您可以将您的接受者设置为使用自定义请求类

(setf (acceptor-request-class acceptor ) new-value)

所以像这样

(defparameter *requests* nil)
(defclass my-request (hunchentoot:request) ())
(defmethod initialize-instance  :after ((req my-request) &key)
  (push req *requests*))

然后将接受者请求类设置为在您制作接受者时使用它,例如

(setf (hunchentoot:acceptor-request-class 
        (make-instance 'hunchentoot:easy-acceptor)) 'my-request)

每次此接收器创建请求以传递给处理程序时,它将被添加到*requests*列表中。

如果您使用变量来指定请求类名称,则可以打开和关闭此类以进行开发/调试。

然后,您可以在测试绑定中从此堆栈中获取请求。

于 2015-02-20T12:01:04.377 回答