I'm using fastify-multer and JSON Schema to submit multipart form data that may include a file. No matter what I do, Fastify keeps giving me a bad response error:
{ "statusCode": 400, "error": "Bad Request", "message": "body must be object" } Here is my index.ts:
const server = fastify(); server.register(require("@fastify/cors")); server.register(multer.contentParser).after(() => { if (!isProdEnv) { server.register(require("@fastify/swagger"), { /* ... */ }); } server.register(require("@fastify/auth")).after(() => { server.decorate("authenticateRequest", authenticateRequest); server.decorate("requireAuthentication", requireAuthentication); server.addHook("preHandler", server.auth([server.authenticateRequest])); server.register(indexRouter); server.register(authRouter, { prefix: "/auth" }); server.register(usersRouter, { prefix: "/users" }); server.register(listsRouter, { prefix: "/lists" }); server.register(postsRouter, { prefix: "/posts" }); server.register(searchRouter, { prefix: "/search" }); server.register(settingsRouter, { prefix: "/settings" }); }); }); server.setErrorHandler((err, req, res) => { req.log.error(err.toString()); res.status(500).send(err); }); And the /posts/create endpoint:
const postsRouter = (server: FastifyInstance, options: FastifyPluginOptions, next: HookHandlerDoneFunction) => { server.post( "/create", { schema: { consumes: ["multipart/form-data"], body: { content: { type: "string" }, media: { type: "string", format: "binary" }, "media-description": { type: "string" } } }, preHandler: [server.auth([server.requireAuthentication]), uploadMediaFileToCloud] }, postsController.createPost ); next(); }; export default postsRouter; Request CURL:
curl -X 'POST' \ 'http://localhost:3072/posts/create' \ -H 'accept: */*' \ -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJoYW5kbGUiOiJ1bGtrYSIsInVzZXJJZCI6IjYyNGQ5NmY4NzFhOTI2OGY2YzNjZWExZCIsImlhdCI6MTY1NzEwNTg5NCwiZXhwIjoxNjU3NDA1ODk0fQ.A5WO3M-NhDYGWkILQLVCPfv-Ve-e_Dlm1UYD2vj5UrQ' \ -H 'Content-Type: multipart/form-data' \ -F 'content=Test.' \ -F '[email protected];type=image/png' \ -F 'media-description=' \ Why is this not working?
fastify-multipartrequired forfastify-multerto work? It's never mentioned anywhere in the documentation!