Fix server functions failing when called from backend code (#4908)
* fix(fullstack-macro): allow server functions to be called without HTTP context Server functions can now be invoked directly from server-side code without requiring an HTTP request context. When called outside an HTTP handler, extractors will use default values instead of failing, matching the behavior of the old server_fn implementation. Closes #4907 * fix(fullstack-macro): allow server functions without extractors to be called from backend Functions with no server extractors use Default::default() and work from backend code. Functions with extractors still require HTTP context. Closes #4907
This commit is contained in:
1 parent
791fa4be7b
commit
af215e4e80
1 file changed
+15
-2
@@ -432,6 +432,15 @@ fn route_impl_with_route(
|
||||
|
||||
let extracted_as_server_headers = route.extracted_as_server_headers(query_tokens.clone());
|
||||
|
||||
// Generate extraction code based on whether there are server extractors
|
||||
let extraction_code = if route.server_args.is_empty() {
|
||||
quote! { Default::default() }
|
||||
} else {
|
||||
quote! {
|
||||
dioxus_fullstack::FullstackContext::extract::<(#(#server_types,)*), _>().await?
|
||||
}
|
||||
};
|
||||
|
||||
Ok(quote! {
|
||||
#(#fn_docs)*
|
||||
#route_docs
|
||||
@@ -554,8 +563,12 @@ fn route_impl_with_route(
|
||||
)
|
||||
}
|
||||
|
||||
// Extract the server arguments from the context
|
||||
let (#(#server_names,)*) = dioxus_fullstack::FullstackContext::extract::<(#(#server_types,)*), _>().await?;
|
||||
// Extract the server arguments from the context if needed.
|
||||
// If there are no server extractors, use Default::default() which allows
|
||||
// the function to be called from backend code without HTTP context.
|
||||
// If there are server extractors, extraction will fail with a clear error
|
||||
// when called from backend code without HTTP context.
|
||||
let (#(#server_names,)*) = #extraction_code;
|
||||
|
||||
// Call the function directly
|
||||
return #fn_on_server_name #ty_generics(
|
||||
|
||||
Reference in new issue
Block a user