{"library":"odata-v4-server","title":"OData V4 Server for Node.js","description":"odata-v4-server is a Node.js library for building OData Version 4.0 compliant servers. It allows developers to expose OData services either as a standalone server, an Express router, or as a stream. The package facilitates defining service metadata using TypeScript decorators or a JSON schema, supporting standard OData features like query language parsing ($filter, $orderby, $top, $skip, $select, $expand, $count) and CRUD operations on entity sets. It also supports complex types, navigation properties, actions, and functions. Currently at version 0.2.13, its release cadence appears to be irregular as it's still in pre-1.0 development. A key differentiator is its extensive use of decorators for defining controllers and handling OData query parameters, streamlining the development of data services.","language":"javascript","status":"maintenance","last_verified":"Sun Apr 19","install":{"commands":["npm install odata-v4-server"],"cli":null},"imports":["import { ODataServer } from 'odata-v4-server';","import { ODataController } from 'odata-v4-server';","import * as odata from 'odata-v4-server';","import { ODataQuery } from 'odata-v4-server';"],"auth":{"required":false,"env_vars":[]},"quickstart":{"code":"import { ODataController, ODataServer, odata, ODataQuery } from 'odata-v4-server';\nimport { MongoClient, ObjectId } from 'mongodb'; // Assuming MongoDB for example persistence\n\n// Dummy data for demonstration\nconst products: any[] = [];\nconst categories: any[] = [];\n\n// Helper to create a filter function (simplified for example)\nconst createFilter = (filter: ODataQuery) => (item: any) => {\n  // In a real application, you'd parse ODataQuery to build a robust filter predicate.\n  // This is a placeholder.\n  console.warn('Filter parsing in createFilter is simplified for demonstration.');\n  return true;\n};\n\nexport class ProductsController extends ODataController {\n    @odata.GET\n    find(@odata.filter filter: ODataQuery) {\n        if (filter) return products.filter(createFilter(filter));\n        return products;\n    }\n\n    @odata.GET\n    findOne(@odata.key key: string) {\n        return products.find(product => product._id === key);\n    }\n\n    @odata.POST\n    insert(@odata.body product: any) {\n        product._id = new ObjectId().toHexString(); // Simulate MongoDB ID\n        products.push(product);\n        return product;\n    }\n\n    @odata.PATCH\n    update(@odata.key key: string, @odata.body delta: any) {\n        let product = products.find(product => product._id === key);\n        if (product) {\n            Object.assign(product, delta);\n        }\n    }\n\n    @odata.DELETE\n    remove(@odata.key key: string) {\n        const index = products.findIndex(product => product._id === key);\n        if (index > -1) {\n            products.splice(index, 1);\n        }\n    }\n}\n\nexport class CategoriesController extends ODataController {\n    @odata.GET\n    find(@odata.filter filter: ODataQuery) {\n        if (filter) return categories.filter(createFilter(filter));\n        return categories;\n    }\n\n    @odata.GET\n    findOne(@odata.key key: string) {\n        return categories.find(category => category._id === key);\n    }\n\n    @odata.POST\n    insert(@odata.body category: any) {\n        category._id = new ObjectId().toHexString();\n        categories.push(category);\n        return category;\n    }\n\n    @odata.PATCH\n    update(@odata.key key: string, @odata.body delta: any) {\n        let category = categories.find(category => category._id === key);\n        if (category) {\n            Object.assign(category, delta);\n        }\n    }\n\n    @odata.DELETE\n    remove(@odata.key key: string) {\n        const index = categories.findIndex(category => category._id === key);\n        if (index > -1) {\n            categories.splice(index, 1);\n        }\n    }\n}\n\n@odata.cors\n@odata.controller(ProductsController, true)\n@odata.controller(CategoriesController, true)\nexport class NorthwindODataServer extends ODataServer {}\n\n// Initialize some dummy data\nproducts.push({ _id: new ObjectId().toHexString(), name: 'Product A', price: 10, categoryId: 'cat1' });\ncategories.push({ _id: 'cat1', name: 'Category X' });\n\nconsole.log('Starting OData server on port 3000 at /odata...');\nNorthwindODataServer.create('/odata', 3000).then(() => {\n    console.log('OData server started. Try accessing:');\n    console.log('  http://localhost:3000/odata');\n    console.log('  http://localhost:3000/odata/$metadata');\n    console.log('  http://localhost:3000/odata/Products');\n    console.log('  http://localhost:3000/odata/Products(\\'<product_id>\\')');\n}).catch(err => console.error('Failed to start OData server:', err));\n","lang":"typescript","description":"This quickstart demonstrates how to set up a basic OData V4 server with two controllers (Products and Categories) handling standard CRUD operations, using TypeScript decorators for routing and parameter injection. It includes a minimal data store simulation and server initialization.","tag":null,"tag_description":null,"last_tested":null,"results":[]},"compatibility":null}