- Spec files
npm-tanstack--react-start
Describes: pkg:npm/@tanstack/react-start@1.132.x
- Description
- Modern full-stack React framework with SSR, streaming, server functions, and API routes powered by TanStack Router and Vite.
- Author
- tessl
- Last updated
How to use
npx @tessl/cli registry install tessl/npm-tanstack--react-start@1.132.0
request-response.md docs/
1# Request/Response Utilities23TanStack Start provides utilities for accessing HTTP request information within server functions. These utilities give you access to request data, headers, and client information during server-side execution.45## Capabilities67### Request Information Functions89Access information about the current HTTP request.1011```typescript { .api }12/**13* Get the current request object14* @returns Current HTTP request15*/16function getRequest(): Request;1718/**19* Get all request headers20* @returns Object containing all request headers21*/22function getRequestHeaders(): Record<string, string>;2324/**25* Get a specific request header value26* @param name - Header name to retrieve27* @returns Header value or undefined28*/29function getRequestHeader(name: string): string | undefined;3031/**32* Get the client IP address from the request33* @param options - Options for IP detection34* @returns Client IP address or undefined35*/36function getRequestIP(options?: { ipHeader?: string }): string | undefined;37```3839**Usage Examples:**4041```typescript42import {43getRequest,44getRequestHeaders,45getRequestHeader,46getRequestIP47} from "@tanstack/react-start";4849// Access request information in a server function50const getUserInfo = createServerFn()51.handler(async () => {52const request = getRequest();53const headers = getRequestHeaders();54const userAgent = getRequestHeader("user-agent");55const clientIP = getRequestIP({ ipHeader: "x-forwarded-for" });5657return {58method: request.method,59url: request.url,60userAgent,61clientIP,62headers63};64});6566// Using request data for authentication67const authenticatedAction = createServerFn()68.handler(async () => {69const authHeader = getRequestHeader("authorization");7071if (!authHeader || !authHeader.startsWith("Bearer ")) {72throw new Error("Authentication required");73}7475const token = authHeader.substring(7);76// Verify token...7778return { authenticated: true };79});8081// Getting client information82const trackUserAction = createServerFn()83.handler(async (action: string) => {84const request = getRequest();85const userAgent = getRequestHeader("user-agent");86const clientIP = getRequestIP();87const referer = getRequestHeader("referer");8889// Log the action with client information90console.log({91action,92userAgent,93clientIP,94referer,95timestamp: new Date().toISOString()96});9798return { success: true };99});100```101102### Response Utilities103104Utilities for creating and manipulating HTTP responses.105106```typescript { .api }107/**108* Create a JSON response with proper headers109* @param data - Data to serialize as JSON110* @param options - Response options111* @returns JSON response object112*/113function json<T>(114data: T,115options?: { status?: number; headers?: HeadersInit }116): JsonResponse;117118/**119* Merge multiple header objects into one120* @param headers - Header objects to merge121* @returns Merged headers object122*/123function mergeHeaders(...headers: HeadersInit[]): Headers;124```125126**Usage Examples:**127128```typescript129import { json, mergeHeaders } from "@tanstack/react-start";130131// Create JSON responses132const getUsers = createServerFn()133.handler(async () => {134const users = await db.user.findMany();135136return json(users, {137status: 200,138headers: { "Cache-Control": "max-age=300" }139});140});141142// Create responses with merged headers143const createUser = createServerFn()144.handler(async (userData) => {145const user = await db.user.create({ data: userData });146147const responseHeaders = mergeHeaders(148{ "Content-Type": "application/json" },149{ "X-User-ID": user.id },150{ "Cache-Control": "no-cache" }151);152153return json(user, {154status: 201,155headers: responseHeaders156});157});158159// Error responses160const deleteUser = createServerFn()161.handler(async (userId: string) => {162const user = await db.user.findUnique({ where: { id: userId } });163164if (!user) {165return json(166{ error: "User not found" },167{ status: 404 }168);169}170171await db.user.delete({ where: { id: userId } });172173return json({ success: true });174});175```176177## Advanced Usage Patterns178179### Request Body Processing180181```typescript182import { getRequest } from "@tanstack/react-start";183184const processFormData = createServerFn()185.handler(async () => {186const request = getRequest();187188if (request.method !== "POST") {189return json({ error: "Method not allowed" }, { status: 405 });190}191192const contentType = getRequestHeader("content-type");193194if (contentType?.includes("application/json")) {195const jsonData = await request.json();196return json({ received: jsonData });197} else if (contentType?.includes("multipart/form-data")) {198const formData = await request.formData();199const data = Object.fromEntries(formData);200return json({ received: data });201}202203return json({ error: "Unsupported content type" }, { status: 400 });204});205```206207### CORS Handling208209```typescript210import { mergeHeaders, json } from "@tanstack/react-start";211212const corsEnabledApi = createServerFn()213.handler(async () => {214const origin = getRequestHeader("origin");215const allowedOrigins = ["https://example.com", "https://app.example.com"];216217const corsHeaders = allowedOrigins.includes(origin)218? {219"Access-Control-Allow-Origin": origin,220"Access-Control-Allow-Credentials": "true"221}222: {};223224const responseHeaders = mergeHeaders(225{ "Content-Type": "application/json" },226corsHeaders227);228229return json(230{ message: "API response" },231{ headers: responseHeaders }232);233});234```235236### Request Validation237238```typescript239const validateApiKey = createServerFn()240.handler(async () => {241const apiKey = getRequestHeader("x-api-key");242const userAgent = getRequestHeader("user-agent");243const clientIP = getRequestIP();244245if (!apiKey) {246return json(247{ error: "API key required" },248{ status: 401 }249);250}251252// Rate limiting based on IP253const requestCount = await redis.get(`requests:${clientIP}`);254if (requestCount && parseInt(requestCount) > 100) {255return json(256{ error: "Rate limit exceeded" },257{ status: 429 }258);259}260261// Validate API key262const isValid = await validateAPIKey(apiKey);263if (!isValid) {264return json(265{ error: "Invalid API key" },266{ status: 403 }267);268}269270// Increment request count271await redis.incr(`requests:${clientIP}`);272await redis.expire(`requests:${clientIP}`, 3600);273274return json({ success: true });275});276```277278## Types279280```typescript { .api }281// JSON response type282interface JsonResponse {283json(): any;284status: number;285headers: Headers;286ok: boolean;287statusText: string;288}289290// Request IP options291interface RequestIPOptions {292ipHeader?: string;293}294```