Skip to main content

hono

This guide will walk you through setting up a Hono application with @mercury-js/core, enabling you to quickly build a robust and secure API backend.

Project Structure

Here's a recommended project structure:

your-project
├── src
│ ├── index.ts
│ ├── models
│ ├── profiles
│ └── hooks
├── tsconfig.json
├── package.json
└── ...

Setting up the server

  1. Install required dependencies:

    npm install @mercury-js/core hono @hono/graphql-server graphql-middleware graphql-tools
  2. Create the main application file (src/index.ts):

    import { Hono } from "hono";
    import { type RootResolver, graphqlServer } from "@hono/graphql-server";
    import "./models";
    import "./profiles";
    import mercury from "@mercury-js/core";
    import { applyMiddleware } from "graphql-middleware";
    import { makeExecutableSchema } from "graphql-tools";
    import type { Context, Next } from 'hono'

    export const app = new Hono();

    // Connect to your MongoDB database
    mercury.connect(process.env.DB_URL || "mongodb://localhost:27017/mercury");

    // Add additional GraphQL typedefs and resolvers (optional)
    const typeDefs = `
    type Query {
    hello: String
    }
    `;

    const resolvers = {
    Query: {
    hello: (root: any, {}, ctx: Context) => "Hello Hono!" + JSON.stringify(ctx.get("user")),
    },
    };
    mercury.addGraphqlSchema(typeDefs, resolvers);

    // Create the GraphQL schema
    const schema = applyMiddleware(
    makeExecutableSchema({
    typeDefs: mercury.typeDefs,
    resolvers: mercury.resolvers,
    })
    );

    // Add a middleware to set user context
    app.use("*", async (ctx: Context, next: Next) => {
    ctx.set("user", {
    id: "122",
    profile: "Admin"
    });
    await next();
    });

    // Set up GraphQL endpoint
    app.use(
    "/graphql",
    graphqlServer({
    schema,
    rootResolver: (c) => {
    return mercury.resolvers
    },
    graphiql: true,
    })
    );

    // Start the server
    app.fire();

    const port = parseInt(process.env.PORT!) || 3000;
    console.log(`Running at http://localhost:${port}`);

    export default {
    port,
    fetch: app.fetch,
    };

Creating Models, Setting Up Profiles, and Using Hooks

For setting up models, hooks, and profiles, please refer to the Next.js setup page. The process is similar.

Running the Server

  1. Start the Development Server:

    npm run dev

Now, you have a Hono application with a secure, efficient, and scalable API backend powered by @mercury-js/core. You can access your GraphQL API by making requests to your endpoint, for example:

http://localhost:3000/graphql

This setup allows you to leverage the speed and simplicity of Hono along with the powerful features of Mercury.js to build complex applications with ease and security.