{"id":47987,"library":"groa","title":"Groa","description":"Express gRPC middleware framework for Node.js that provides a Koa 2-style middleware system and API. Current stable version is 0.0.15. It supports async/await based middleware, bidirectional streaming, and a built-in status code system. Key differentiators include familiar Koa-like context and middleware pattern, built-in proto loading, and streaming support. Release cadence is irregular. Requires Node.js v7.6+.","status":"active","version":"0.0.15","language":"javascript","source_language":"en","source_url":"https://github.com/GroaJS/groa","tags":["javascript","framework","grpc"],"install":[{"cmd":"npm install groa","lang":"bash","label":"npm"},{"cmd":"yarn add groa","lang":"bash","label":"yarn"},{"cmd":"pnpm add groa","lang":"bash","label":"pnpm"}],"dependencies":null,"imports":[{"note":"Groa uses CommonJS; there is no default ESM export.","wrong":"import Groa from 'groa'","symbol":"Groa","correct":"const Groa = require('groa')"},{"note":"Use the Groa.status enum for readability.","wrong":"ctx.status = 10","symbol":"status constants","correct":"ctx.status = Groa.status.ABORTED"},{"note":"Middleware must be async functions; plain functions will not work.","wrong":"app.use(function(ctx, next) { ... })","symbol":"middleware","correct":"app.use(async (ctx, next) => { ... })"}],"quickstart":{"code":"const Groa = require('groa');\nconst app = new Groa();\napp.addProto(__dirname + '/example.proto');\napp.use(async (ctx, next) => {\n  ctx.body = ctx.req.body;\n});\napp.listen(50051, () => {\n  console.log('Listening on port 50051');\n});","lang":"javascript","description":"Sets up a Groa gRPC server that echoes the request body back."},"warnings":[{"fix":"Use async functions for middleware.","message":"Groa is not compatible with plain callback functions; middleware must be async/await.","severity":"gotcha","affected_versions":">=0.0.1"},{"fix":"Use __dirname + '/relative/path' or path.resolve().","message":"The 'addProto' method expects an absolute path or relative path from cwd; relative paths may fail if not run from project root.","severity":"gotcha","affected_versions":">=0.0.1"},{"fix":"Ensure stream is open before writing.","message":"Streaming methods: ctx.body.write() must be called only after the stream is open; early writes may be lost.","severity":"gotcha","affected_versions":">=0.0.1"}],"env_vars":null,"search_vec":"'0.0.15':22 '2':12 'api':17 'async/await':25 'base':26 'bidirect':28 'built':33,50 'built-in':32,49 'cadenc':58 'code':36 'context':45 'current':18 'differenti':39 'express':2 'familiar':41 'framework':5,65 'groa':1 'grpc':3,66 'includ':40 'irregular':60 'javascript':64 'key':38 'koa':11,43 'koa-lik':42 'like':44 'load':53 'middlewar':4,14,27,47 'node.js':7,62 'pattern':48 'proto':52 'provid':9 'releas':57 'requir':61 'stabl':19 'status':35 'stream':29,55 'style':13 'support':24,56 'system':15,37 'v7.6':63 'version':20","created_at":"2026-06-07T16:54:21.582908+00:00","updated_at":"2026-06-07T16:54:21.582908+00:00","problems":[{"fix":"Ensure middleware is async and calls await next() if needed.","cause":"Middleware not waiting for next() or not returning a promise.","error":"TypeError: Cannot read property 'body' of undefined"},{"fix":"Run 'npm install groa --save'.","cause":"Package not installed.","error":"Error: Cannot find module 'groa'"}],"ecosystem":"npm","meta_description":null,"install_score":null,"quickstart_score":null,"quickstart_tag":null,"pypi_latest":null,"cli_name":null,"cli_version":null,"type":"library","homepage":"https://github.com/GroaJS/groa#readme","github":"https://github.com/GroaJS/groa","docs":null,"changelog":null,"pypi":null,"npm":"groa","openapi_spec":null,"status_page":null,"smithery":null,"categories":["devops"],"base_url":null,"auth_type":null,"provenance":{"verified_status":null,"verified_at":null,"last_verified":"2026-06-07","next_check":"2026-09-05","install_tag":null}}