#Recommended way to handle mutation responses

3 messages · Page 1 of 1 (latest)

tawny widget
#

Hey everyone, I've been exploring Convex lately and after reading the docs on mutations I couldn't find an answer for this. What is the recommended way to handle success/error responses from my mutations? Should I just include a try/catch in the handler function like this?

// mutations/myMutation.ts
import { mutation } from "./_generated/server";

export const createUser = mutation({
  args: { name: v.string(), email: v.string() },
  handler: async (ctx, args) => {
    try {
      // Your mutation logic
      const userId = await ctx.db.insert("users", {
        name: args.name,
        email: args.email,
      });
      
      return { success: true, userId };
    } catch (error) {
      // Handle the error
      console.error("Failed to create user:", error);
      throw new Error("Failed to create user");
    }
  },
});

Or should I return a value and handle the error in the mutation call like this?

// mutations/myMutation.ts
export const createUserSafe = mutation({
  args: { name: v.string(), email: v.string() },
  handler: async (ctx, args) => {
    try {
      const userId = await ctx.db.insert("users", {
        name: args.name,
        email: args.email,
      });
      
      return { 
        success: true, 
        data: { userId },
        error: null 
      };
    } catch (error) {
      return { 
        success: false, 
        data: null,
        error: error.message 
      };
    }
  },
});
flint harborBOT
#

Thanks for posting in #1088161997662724167.
Reminder: If you have a Convex Pro account, use the Convex Dashboard to file support tickets.

    - Provide context: What are you trying to achieve, what is the end-user interaction, what are you seeing? (full error message, command output, etc.)
    - Use [search.convex.dev](https://search.convex.dev) to search Docs, Stack, and Discord all at once.
    - Additionally, you can post your questions in the Convex Community's #1228095053885476985 channel to receive a response from AI.
    - Avoid tagging staff unless specifically instructed.

    Thank you!
tall tangle
#

Either way is valid. I'd generally recommend returning errors as a typed value for expected errors and reserving thrown errors for cases where an error shouldn't happen, but might.

That said, you don't need to wrap every insert/update expecting system errors and just let the system throw for that case.