2015-04-22 4 views
2

Как создать глобальный декоратор в RESTAS?Как создать глобальный декоратор Restas

;;;; defmodule.lisp 
(in-package #:restas) 
(defclass fake-server-route (routes:proxy-route)()) 
(defun @fake-server (route) 
    (make-instance 'fake-server-route :target route)) 
(defmethod restas:process-route :before ((route fake-server-route) bindings) 
    (setf (hunchentoot:header-out :server) "Powered by NodeJS")) 

(restas:define-module #:myapp 
    (:use #:cl #:st-json) 
    (:render-method #'st-json:write-json-to-string) 
    (:content-type "application/json") 
    (:decorators #'restas:@fake-server) ; this line here does not work 
    ; it gives The symbol "@FAKE-SERVER" is not external in the RESTAS package. 
) 

(in-package #:myapp) 

(defparameter *template-directory* 
    (merge-pathnames #P"templates/" myapp-config:*base-directory*)) 

(defparameter *static-directory* 
    (merge-pathnames #P"static/" myapp-config:*base-directory*)) 

Если я сделать @ поддельный-сервер внешнего символа в каком-либо другом пакете, и я пытаюсь использовать его, он все равно не работает, это дало бы что-то вроде:

ошибки defpackage, UNKOWN опция: декораторы

Используя двойное обозначение двоеточие дает следующее:

COMPILE-FILE-ERROR while 
compiling #<CL-SOURCE-FILE "myapp" "defmodule"> 
    [Condition of type UIOP/LISP-BUILD:COMPILE-FILE-ERROR] 

Backtrace: 
    0: (UIOP/LISP-BUILD:CHECK-LISP-COMPILE-RESULTS NIL T T "~/asdf-action::format-action/" ((#<ASDF/LISP-ACTION:COMPILE-OP > . #<ASDF/LISP-ACTION:CL-SOURCE-FILE "myapp" "defmodule">))) 
    1: ((SB-PCL::EMF ASDF/ACTION:PERFORM) #<unused argument> #<unused argument> #<ASDF/LISP-ACTION:COMPILE-OP > #<ASDF/LISP-ACTION:CL-SOURCE-FILE "myapp" "defmodule">) 
    2: ((:METHOD ASDF/ACTION:PERFORM-WITH-RESTARTS :AROUND (T T)) #<ASDF/LISP-ACTION:COMPILE-OP > #<ASDF/LISP-ACTION:CL-SOURCE-FILE "myapp" "defmodule">) [fast-method] 
    3: ((:METHOD ASDF/PLAN:PERFORM-PLAN (LIST)) ((#1=#<ASDF/LISP-ACTION:COMPILE-OP > . #<ASDF/SYSTEM:SYSTEM "alexandria">) (#1# . #<ASDF/COMPONENT:MODULE #2="trivial-features" "src">) (#1# . #<ASDF/SYSTEM:SY.. 
    4: ((FLET SB-C::WITH-IT :IN SB-C::%WITH-COMPILATION-UNIT)) 
    5: ((:METHOD ASDF/PLAN:PERFORM-PLAN :AROUND (T)) ((#1=#<ASDF/LISP-ACTION:COMPILE-OP > . #<ASDF/SYSTEM:SYSTEM "alexandria">) (#1# . #<ASDF/COMPONENT:MODULE #2="trivial-features" "src">) (#1# . #<ASDF/SYST.. 
    6: ((FLET SB-C::WITH-IT :IN SB-C::%WITH-COMPILATION-UNIT)) 
    7: ((:METHOD ASDF/PLAN:PERFORM-PLAN :AROUND (T)) #<ASDF/PLAN:SEQUENTIAL-PLAN {1009701223}> :VERBOSE NIL) [fast-method] 
    8: ((:METHOD ASDF/OPERATE:OPERATE (ASDF/OPERATION:OPERATION ASDF/COMPONENT:COMPONENT)) #<ASDF/LISP-ACTION:LOAD-OP :VERBOSE NIL> #<ASDF/SYSTEM:SYSTEM "myapp"> :VERBOSE NIL) [fast-method] 
    9: ((SB-PCL::EMF ASDF/OPERATE:OPERATE) #<unused argument> #<unused argument> #<ASDF/LISP-ACTION:LOAD-OP :VERBOSE NIL> #<ASDF/SYSTEM:SYSTEM "myapp"> :VERBOSE NIL) 
10: ((LAMBDA NIL :IN ASDF/OPERATE:OPERATE)) 
11: ((:METHOD ASDF/OPERATE:OPERATE :AROUND (T T)) #<ASDF/LISP-ACTION:LOAD-OP :VERBOSE NIL> #<ASDF/SYSTEM:SYSTEM "myapp"> :VERBOSE NIL) [fast-method] 
12: ((SB-PCL::EMF ASDF/OPERATE:OPERATE) #<unused argument> #<unused argument> ASDF/LISP-ACTION:LOAD-OP "myapp" :VERBOSE NIL) 
13: ((LAMBDA NIL :IN ASDF/OPERATE:OPERATE)) 
14: (ASDF/CACHE:CALL-WITH-ASDF-CACHE #<CLOSURE (LAMBDA NIL :IN ASDF/OPERATE:OPERATE) {10096ADFDB}> :OVERRIDE NIL :KEY NIL) 
15: ((:METHOD ASDF/OPERATE:OPERATE :AROUND (T T)) ASDF/LISP-ACTION:LOAD-OP "myapp" :VERBOSE NIL) [fast-method] 
16: ((:METHOD ASDF/OPERATE:OPERATE :AROUND (T T)) ASDF/LISP-ACTION:LOAD-OP "myapp" :VERBOSE NIL) [fast-method] 
17: ((LAMBDA NIL :IN QUICKLISP-CLIENT::APPLY-LOAD-STRATEGY)) 

ответ

1
The symbol "@FAKE-SERVER" is not external in the RESTAS package 

Вы можете получить доступ к этому символу, используя двойную нотацию двоеточия, то есть #'restas::@fake-server.

Однако, поскольку вы не являетесь автором пакета restas, вам может потребоваться определить функцию @fake-server в собственном пакете.

Я не могу помочь вам с вашей последующей проблемой, поскольку, насколько я понимаю документацию, вы используете вариант decoractors правильно.