How pass Mongo collection to EJS template and then create select tag with customizable options

3 min read 29-09-2024
How pass Mongo collection to EJS template and then create select tag with customizable options


In web development, rendering dynamic content is essential for providing a personalized user experience. One common task is passing a MongoDB collection to an EJS (Embedded JavaScript) template, particularly when creating interactive elements like a customizable <select> tag. In this article, we'll walk through the steps needed to achieve this effectively.

Original Problem Scenario

The goal is to fetch data from a MongoDB collection, pass it to an EJS template, and create a select tag populated with customizable options. Below is an example of the code used to address this problem:

const express = require('express');
const mongoose = require('mongoose');
const ejs = require('ejs');
const app = express();

// Connect to MongoDB
mongoose.connect('mongodb://localhost:27017/mydatabase', { useNewUrlParser: true, useUnifiedTopology: true });

// Define a schema and model
const ItemSchema = new mongoose.Schema({
  name: String,
});
const Item = mongoose.model('Item', ItemSchema);

// Set up view engine
app.set('view engine', 'ejs');

app.get('/select', async (req, res) => {
  try {
    const items = await Item.find({});
    res.render('selectPage', { items });
  } catch (error) {
    res.status(500).send(error);
  }
});

// Start the server
app.listen(3000, () => {
  console.log('Server is running on http://localhost:3000');
});

Step-by-Step Breakdown

1. Setting Up the Environment

Before we start coding, ensure you have Node.js and MongoDB installed. Create a new project and install the required packages by running the following command:

npm install express mongoose ejs

2. Connecting to MongoDB

The code connects to a local MongoDB instance using Mongoose. Adjust the connection string as needed to point to your MongoDB server. Ensure your database is running and accessible.

3. Creating a Mongoose Model

In this example, we define a simple schema for items with a single field, name. You can expand this schema by adding more fields based on your application's needs.

4. Rendering the EJS Template

In the /select route, we fetch all items from the MongoDB collection and pass the result to the EJS template called selectPage.ejs. This is where the magic happens, as the fetched data will dynamically populate our select options.

5. Creating the EJS Template

Now, let's create the selectPage.ejs file in the views directory:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Select Item</title>
</head>
<body>
    <h1>Select an Item</h1>
    <form>
        <label for="itemSelect">Choose an item:</label>
        <select id="itemSelect" name="items">
            <% items.forEach(item => { %>
                <option value="<%= item._id %>"><%= item.name %></option>
            <% }); %>
        </select>
        <input type="submit" value="Submit">
    </form>
</body>
</html>

In this template:

  • We loop through the items array passed from our Express route using EJS syntax.
  • For each item, we create an <option> element, using the item’s ID as the value and the item’s name as the display text.

Practical Example

Imagine you have a collection of products in your MongoDB, and you want users to select a product from a dropdown. By following the above steps, you can dynamically generate a list of products in a select dropdown. This provides a seamless way for users to interact with your application, selecting items based on real-time data from your database.

Conclusion

By passing a MongoDB collection to an EJS template, you can create interactive components like a select tag filled with customizable options. This not only enhances the user experience but also allows for the dynamic use of data from your application’s database.

Additional Resources

By following the guide above, you'll be well-equipped to integrate MongoDB with EJS for building dynamic web applications. Happy coding!