How to display the data returned from an async function in .ejs?

I am passing an object containing async functions to the .ejs file

const express = require('express')
const app = express()
const PORT = process.env.PORT || 3000

const functions = require('./functions.js')

app.set('view-engine', 'ejs')

app.listen(PORT, () => {
    console.log('listening on 3000', new Date())
app.get('/', (req, res) => {
    res.render('dashboard.ejs', { functions })

the function console logs the data and also returns it

const getPrice = async (coin) => {
    let data = await CoinGeckoClient.coins.fetch(coin);
    console.log(coin, "GBP",
    console.log(, '% / 24 hours')
    return `
    ${coin} "GBP" ${}
    ${}% / 24 hours')

I want to render the returned data in the .ejs file. Im trying this

        <%= functions.getPrice('ethereum') %>

the console log is successful when I refresh the browser

ethereum GBP 3141.5
3.00725 % / 24 hours

so the function is being called, but the data is not rendered to the screen.

I instead get [object Promise].

I feel like this is an async issue but not sure how/if I can get the ejs to await the returning data. Am I structuring this wrongly?

Any help gratefully appreciated!


You can call your function in your JS file then pass the result to the EJS file:

app.get('/', async(req, res) => {
    res.render('dashboard.ejs', { price: await functions.getPrice('ethereum')})

Then in your EJS:

        <%= price %>