Skip to main content
Glama

SFCC Development MCP Server

by taurgis
server.md10.9 kB
# Class Server ## Inheritance Hierarchy - Object - sfra.models.Server ## Description The SFRA Server class is the core routing solution for Salesforce Commerce Cloud's Storefront Reference Architecture (SFRA). This class provides a comprehensive middleware-based routing system that handles HTTP requests, manages route registration, and coordinates the request-response lifecycle. The Server class supports route definition with middleware chains, HTTP method shortcuts (GET/POST), route modification capabilities (prepend/append/replace), and integration with SFCC's hook system for extensibility. It serves as the foundation for all SFRA controller functionality, providing a structured approach to handling web requests with support for caching, personalization, redirects, and various rendering strategies. ## Properties ### routes **Type:** Object Internal registry of all registered routes, indexed by route name. ## Constructor Summary ### Server **Signature:** `Server()` Creates a new Server instance with an empty routes registry. ## Method Summary ### use **Signature:** `use(name, ...middleware) : Route` Creates a new route with middleware chain. ### get **Signature:** `get(name, ...middleware) : Route` Creates a GET-specific route with automatic HTTP method validation. ### post **Signature:** `post(name, ...middleware) : Route` Creates a POST-specific route with automatic HTTP method validation. ### exports **Signature:** `exports() : Object` Returns an exportable object containing all registered routes. ### extend **Signature:** `extend(server) : void` Extends the current server with routes from another server object. ### prepend **Signature:** `prepend(name, ...middleware) : void` Adds middleware to the beginning of an existing route's chain. ### append **Signature:** `append(name, ...middleware) : void` Adds middleware to the end of an existing route's chain. ### replace **Signature:** `replace(name, ...middleware) : void` Replaces an existing route with a new middleware chain. ### getRoute **Signature:** `getRoute(name) : Route` Retrieves a specific route by name. ## Method Detail ### use **Signature:** `use(name, ...middleware) : Route` **Description:** Creates a new route with the specified name and middleware chain. Automatically creates Request and Response objects from global SFCC objects and sets up route completion handling including caching, personalization, and rendering. **Parameters:** - `name` (String) - Unique name for the route - `...middleware` (Function[]) - Variable number of middleware functions to execute **Returns:** Route object representing the created route. **Throws:** - Error if name is not a string - Error if middleware contains non-function items - Error if route name already exists **Route Completion Handling:** - Sets cache expiration based on `res.cachePeriod` and `res.cachePeriodUnit` - Applies personalization with `price_promotion` vary-by header when `res.personalized` is true - Handles redirects with optional status codes - Applies rendering through the render system ### get **Signature:** `get(name, ...middleware) : Route` **Description:** Convenience method for creating GET-only routes. Automatically prepends HTTP GET validation middleware to the chain. **Parameters:** - `name` (String) - Unique name for the route - `...middleware` (Function[]) - Variable number of middleware functions **Returns:** Route object with GET method validation. ### post **Signature:** `post(name, ...middleware) : Route` **Description:** Convenience method for creating POST-only routes. Automatically prepends HTTP POST validation middleware to the chain. **Parameters:** - `name` (String) - Unique name for the route - `...middleware` (Function[]) - Variable number of middleware functions **Returns:** Route object with POST method validation. ### exports **Signature:** `exports() : Object` **Description:** Creates an exportable object containing all registered routes with their public interfaces. Includes internal routes registry for extension capabilities. **Returns:** Object with route names as keys and route interfaces as values, plus `__routes` property containing internal routes. **Export Format:** ```javascript { "routeName": { /* route interface */ }, "__routes": { /* internal routes registry */ } } ``` ### extend **Signature:** `extend(server) : void` **Description:** Extends the current server with routes from another server object created by the `exports()` method. Validates the server object structure before extension. **Parameters:** - `server` (Object) - Server object created by `exports()` method **Throws:** - Error if server object is invalid (missing `__routes`) - Error if server has no routes to extend ### prepend **Signature:** `prepend(name, ...middleware) : void` **Description:** Adds middleware functions to the beginning of an existing route's middleware chain, allowing for route enhancement and modification. **Parameters:** - `name` (String) - Name of existing route to modify - `...middleware` (Function[]) - Middleware functions to prepend **Throws:** - Error if name is not a string - Error if middleware contains non-function items - Error if route does not exist ### append **Signature:** `append(name, ...middleware) : void` **Description:** Adds middleware functions to the end of an existing route's middleware chain, enabling route extension and additional processing. **Parameters:** - `name` (String) - Name of existing route to modify - `...middleware` (Function[]) - Middleware functions to append **Throws:** - Error if name is not a string - Error if middleware contains non-function items - Error if route does not exist ### replace **Signature:** `replace(name, ...middleware) : void` **Description:** Completely replaces an existing route with a new middleware chain, maintaining the same route name but changing implementation. **Parameters:** - `name` (String) - Name of existing route to replace - `...middleware` (Function[]) - New middleware functions for the route **Throws:** - Error if name is not a string - Error if middleware contains non-function items - Error if route does not exist ### getRoute **Signature:** `getRoute(name) : Route` **Description:** Retrieves a specific route object by name for inspection or direct manipulation. **Parameters:** - `name` (String) - Name of the route to retrieve **Returns:** Route object if found, undefined otherwise. ## Route Lifecycle Management ### Route Creation Process 1. **Parameter Validation**: Validates route name and middleware chain 2. **Request/Response Creation**: Creates SFRA Request and Response objects from globals 3. **Route Object Creation**: Instantiates Route with name, middleware, request, and response 4. **Event Handler Registration**: Sets up `route:Complete` event handler 5. **Route Registration**: Stores route in internal registry 6. **Hook Integration**: Calls `app.server.registerRoute` hook if available ### Route Completion Handling **Cache Management:** - Applies cache expiration when `res.cachePeriod` is set - Supports minutes or hours as cache period units (defaults to hours) - Sets HTTP expires header on the response **Personalization:** - Sets `price_promotion` vary-by header when `res.personalized` is true - Enables proper caching behavior for personalized content **Redirect Processing:** - Handles redirect URLs with optional status codes - Emits `route:Redirect` event before redirecting - Supports both default and custom redirect status codes **Rendering Pipeline:** - Applies all accumulated renderings through the render system - Processes ISML templates, JSON responses, XML output, and Page Designer pages ## Integration Points ### Global Object Integration **Request Object Creation:** ```javascript var rq = new Request( typeof request !== 'undefined' ? request : {}, typeof customer !== 'undefined' ? customer : {}, typeof session !== 'undefined' ? session : {} ); ``` **Response Object Creation:** ```javascript var rs = new Response(typeof response !== 'undefined' ? response : {}); ``` ### Hook System Integration The server integrates with SFCC's hook system through the `app.server.registerRoute` hook, allowing: - Custom route event handlers - Route-specific processing extensions - Integration with custom middleware systems ### Middleware Architecture **Middleware Function Signature:** ```javascript function middleware(req, res, next) { // Middleware logic next(); // Continue to next middleware } ``` **Middleware Chain Execution:** - Sequential execution of middleware functions - Support for asynchronous operations through next() callbacks - Automatic error handling and route completion ## Usage Examples ### Basic Route Creation ```javascript server.use('HomePage', function(req, res, next) { res.render('home/homepage', { title: 'Welcome' }); next(); }); ``` ### HTTP Method-Specific Routes ```javascript server.get('ProductShow', middleware.cache, function(req, res, next) { // GET-only route with caching next(); }); server.post('CartAdd', middleware.csrf, function(req, res, next) { // POST-only route with CSRF protection next(); }); ``` ### Route Modification ```javascript // Add authentication to existing route server.prepend('Account-Show', middleware.auth); // Add logging to existing route server.append('Checkout-Begin', middleware.logging); // Replace route implementation server.replace('Search-Show', newSearchMiddleware); ``` ### Server Extension ```javascript // Export routes from one server var exportedRoutes = server.exports(); // Extend another server var newServer = new Server(); newServer.extend(exportedRoutes); ``` ## Error Handling ### Parameter Validation Errors - **Invalid Route Name**: Throws error if first parameter is not a string - **Invalid Middleware**: Throws error if middleware chain contains non-functions - **Duplicate Route**: Throws error if route name already exists ### Extension Errors - **Invalid Server Object**: Throws error for objects missing `__routes` property - **Empty Server**: Throws error when extending with server that has no routes ### Route Modification Errors - **Non-Existent Route**: Throws error when trying to modify routes that don't exist - **Invalid Parameters**: Validates parameters before attempting modifications ## Property Details ### routes **Type:** Object **Description:** Internal registry storing all route definitions indexed by route name. Each entry contains a Route object with the complete middleware chain and configuration. **Structure:** ```javascript { "routeName": Route, // Route object instance "anotherRoute": Route } ``` This registry enables route lookup, modification, and export functionality while maintaining the complete route configuration and state. ---

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/taurgis/sfcc-dev-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server