Lack中间件包装Ningle应用后添加路由报错的技术问询
解决Ningle/Lack添加中间件后无法动态修改路由的问题
问题根源
Lack的lack:builder返回的是一个Lack应用函数,而非原始的Ningle app实例。当你用setf *app*把包装后的函数覆盖原Ningle实例后,*app*的类型从ningle:app变为函数,调用(setf n:route)时,通用函数找不到针对函数类型的方法,就会抛出「No applicable method」错误。
解决方案
核心思路是保留原始Ningle实例的独立引用,不要用中间件包装后的函数覆盖它。具体操作:
- 单独存储原始Ningle app实例:
(defvar *ningle-app* (make-instance 'n:app))
- 用新变量存储包装中间件后的应用函数:
(defparameter *application-root* (asdf:system-source-directory :my-project)) (defparameter *static-directory* (merge-pathnames #P"static/" *application-root*)) (defvar *app* (lack:builder (:static :path (lambda (path) (if (ppcre:scan "^(?:/images/|/css/|/js/|/robot\\.txt$|/favicon\\.$)" path) path nil)) :root *static-directory*) :backtrace :session (lambda (app) (lambda (env) (funcall app env))) *ningle-app*))
- 后续新增/修改路由时,操作原始的
*ningle-app*:
(setf (n:route *ningle-app* "agents/:id/endpoint" :method :post) #'(lambda (params) (route-fun params)))
效果验证
修改后,即便中间件已包装完成,你仍可随时调整*ningle-app*的路由,无需重启Lisp会话,变更会实时生效。若需调整中间件配置,只需重新运行lack:builder将*ningle-app*重新包装,再赋值给*app*即可。
内容的提问来源于stack exchange,提问作者mooseface
相关产品推荐
相关产品推荐

