diff --git a/bun.lock b/bun.lock index 3ca965a..2a60b78 100644 --- a/bun.lock +++ b/bun.lock @@ -4,7 +4,9 @@ "": { "name": "wxocr", "dependencies": { + "@hono/zod-validator": "^0.7.1", "hono": "^4.8.4", + "zod": "^4.0.5", }, "devDependencies": { "@antfu/eslint-config": "^4.16.2", @@ -67,6 +69,8 @@ "@eslint/plugin-kit": ["@eslint/plugin-kit@0.3.3", "", { "dependencies": { "@eslint/core": "^0.15.1", "levn": "^0.4.1" } }, "sha512-1+WqvgNMhmlAambTvT3KPtCl/Ibr68VldY2XY40SL1CE0ZXiakFR/cbTspaF5HsnpDMvcYYoJHfl4980NBjGag=="], + "@hono/zod-validator": ["@hono/zod-validator@0.7.1", "", { "peerDependencies": { "hono": ">=3.9.0", "zod": "^3.25.0 || ^4.0.0" } }, "sha512-8+vJT1RvezAx5sN7hiZ5Mis0RMuFL77nBEcqQQgT9ufoLkxr+7ll461WlBJQcGoQSY6EGMClVae19v3s/7bbgQ=="], + "@humanfs/core": ["@humanfs/core@0.19.1", "", {}, "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA=="], "@humanfs/node": ["@humanfs/node@0.16.6", "", { "dependencies": { "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.3.0" } }, "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw=="], @@ -633,6 +637,8 @@ "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], + "zod": ["zod@4.0.5", "", {}, "sha512-/5UuuRPStvHXu7RS+gmvRf4NXrNxpSllGwDnCBcJZtQsKrviYXm54yDGV2KYNLT5kq0lHGcl7lqWJLgSaG+tgA=="], + "zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="], "@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], diff --git a/package.json b/package.json index dc4dcab..4c75ea8 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,9 @@ "typescript": "^5.8.3" }, "dependencies": { - "hono": "^4.8.4" + "@hono/zod-validator": "^0.7.1", + "hono": "^4.8.4", + "zod": "^4.0.5" }, "devDependencies": { "@antfu/eslint-config": "^4.16.2", diff --git a/src/index.ts b/src/index.ts index 7170e3b..32577fb 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,28 +1,31 @@ +import { zValidator } from '@hono/zod-validator' import { Hono } from 'hono' import { Buffer } from 'node:buffer' +import { z } from 'zod' import { WechatOCRClient } from './wcocr' const app = new Hono() const client = new WechatOCRClient() -app.post('/ocr', async (c) => { - const formData = await c.req.formData() - const imageFile = formData.get('image') +app.post( + '/ocr', + zValidator('form', z.object({ + image: z.instanceof(File, { message: 'Image file is required' }), + })), + async (c) => { + const { image } = c.req.valid('form') - if (!imageFile || typeof imageFile === 'string') { - return c.json({ error: 'Image file is required' }, 400) - } + const imageBuffer = Buffer.from(await image.arrayBuffer()) - const imageBuffer = Buffer.from(await imageFile.arrayBuffer()) - - try { - const result = await client.recognize(imageBuffer) - return c.json(JSON.parse(result)) - } catch (error) { - console.error('OCR processing error:', error) - return c.json({ error: 'Failed to process image' }, 500) - } -}) + try { + const result = await client.recognize(imageBuffer) + return c.json(JSON.parse(result)) + } catch (error) { + console.error('OCR processing error:', error) + return c.json({ error: 'Failed to process image' }, 500) + } + }, +) export default app