run icon indicating copy to clipboard operation
run copied to clipboard

What's the proper way to access database/api?

Open UROjQ6r80p opened this issue 2 years ago • 1 comments

Let's say I want to fetch products from the database.

that's the old way:

import express from "express";
import markoPlugin from "@marko/express";
import template from "./template.marko";

const app = express();
app.use(markoPlugin()); // Enables `res.marko(template, input)`

app.get("/", function (req, res) {
  const products = req.db.find(...)

  res.marko(template, {
    products
  });
});

app.listen(8080);

What's the proper way to do the same in marko/run?

I tried something like this in +handler.js

export const GET: MarkoRun.Handler = ({ request, platform }, next) => {
    platform.response.locals = {
        data: Math.random()
    }

    next()
};

and then in +page.marko <h1>${$global.platform.response.locals.data}</h1> but i'm not sure it's the best way.

UROjQ6r80p avatar Jul 16 '23 11:07 UROjQ6r80p

I don't think this is the right forum to ask support questions like these; try https://discord.com/invite/marko next time.

But in short, I think the best way to do this is to add a +middleware.js early on, that appends your database connector to context aka $global, using something like context.dbClient = dbClient. This way, you only ever need to create +page.marko with <await($global.dbClient.find(...))> and don't have to litter your code with +handler.js everywhere.

vwong avatar Jul 16 '23 23:07 vwong