1 year ago

#74981

test-img

T. Duke

NodeJS: Heroku deployment internal server, EJS template "not a function" error

I have a NodeJS app, with EJS as the templating engine, and when I deploy to Heroku I'm getting an internal server error. Here are the logs:

2022-01-20T13:30:24.000000+00:00 app[api]: Build started by user tylerdukedev@gmail.com
2022-01-20T13:30:44.605827+00:00 app[api]: Release v18 created by user tylerdukedev@gmail.com
2022-01-20T13:30:44.605827+00:00 app[api]: Deploy 82e13b43 by user tylerdukedev@gmail.com
2022-01-20T13:30:45.000000+00:00 app[api]: Build succeeded
2022-01-20T13:30:45.206696+00:00 heroku[web.1]: Restarting
2022-01-20T13:30:45.219319+00:00 heroku[web.1]: State changed from up to starting
2022-01-20T13:30:45.973448+00:00 heroku[web.1]: Stopping all processes with SIGTERM
2022-01-20T13:30:46.136388+00:00 heroku[web.1]: Process exited with status 143
2022-01-20T13:30:48.058009+00:00 heroku[web.1]: Starting process with command `npm start`
2022-01-20T13:30:50.044342+00:00 app[web.1]:
2022-01-20T13:30:50.115141+00:00 app[web.1]: > food-blog@1.0.0 start /app
2022-01-20T13:30:50.115144+00:00 app[web.1]: > node app.js
2022-01-20T13:30:50.115144+00:00 app[web.1]:
2022-01-20T13:30:50.762969+00:00 app[web.1]: Listening on 47634
2022-01-20T13:30:51.003784+00:00 app[web.1]: Connected to MongoDB
2022-01-20T13:30:51.195440+00:00 heroku[web.1]: State changed from starting to up
2022-01-20T13:30:54.911676+00:00 heroku[router]: at=info method=GET path="/" host=food-blog-tdukedev.herokuapp.com request_id=d02d86c4-86b2-4e44-81c8-83467c04f03d fwd="73.129.233.103" dyno=web.1 connect=0ms service=74ms status=500 bytes=404 protocol=https
2022-01-20T13:30:54.917473+00:00 app[web.1]: TypeError: /app/server/views/index.ejs:132
2022-01-20T13:30:54.917479+00:00 app[web.1]: 130|                         <div class="card-body p-4">
2022-01-20T13:30:54.917481+00:00 app[web.1]: 131|                             <div class="badge bg-primary bg-gradient rounded-pill mb-2" id="cat-1">
2022-01-20T13:30:54.917482+00:00 app[web.1]: >> 132|                                 <%= entries.at(-1).category %>
2022-01-20T13:30:54.917482+00:00 app[web.1]: 133|                             </div>
2022-01-20T13:30:54.917483+00:00 app[web.1]: 134|                                 <a class="text-decoration-none link-dark stretched-link" href="#!">
2022-01-20T13:30:54.917483+00:00 app[web.1]: 135|                                     <h5 class="card-title mb-3 animate__animated" id="title-1">
2022-01-20T13:30:54.917483+00:00 app[web.1]:
2022-01-20T13:30:54.917484+00:00 app[web.1]: entries.at is not a function
2022-01-20T13:30:54.917484+00:00 app[web.1]: at eval (eval at compile (/app/node_modules/ejs/lib/ejs.js:662:12), <anonymous>:12:34)
2022-01-20T13:30:54.917485+00:00 app[web.1]: at index (/app/node_modules/ejs/lib/ejs.js:692:17)
2022-01-20T13:30:54.917485+00:00 app[web.1]: at tryHandleCache (/app/node_modules/ejs/lib/ejs.js:272:36)
2022-01-20T13:30:54.917486+00:00 app[web.1]: at View.exports.renderFile [as engine] (/app/node_modules/ejs/lib/ejs.js:489:10)
2022-01-20T13:30:54.917486+00:00 app[web.1]: at View.render (/app/node_modules/express/lib/view.js:135:8)
2022-01-20T13:30:54.917486+00:00 app[web.1]: at tryRender (/app/node_modules/express/lib/application.js:640:10)
2022-01-20T13:30:54.917486+00:00 app[web.1]: at Function.render (/app/node_modules/express/lib/application.js:592:3)
2022-01-20T13:30:54.917487+00:00 app[web.1]: at ServerResponse.render (/app/node_modules/express/lib/response.js:1017:7)
2022-01-20T13:30:54.917487+00:00 app[web.1]: at ServerResponse.res.render (/app/node_modules/express-ejs-layouts/lib/express-layouts.js:77:18)
2022-01-20T13:30:54.917488+00:00 app[web.1]: at exports.homepage (/app/server/controllers/homepageController.js:6:15)

entries.at is pulling from a MongoDB database with Mongoose, it's populating data from the db.

I've tried to set the views directory to be relative and absolute (per an SO question/answer), and that didn't work.

Here's what entries references:

homepageController.js:

// get home page ('index');
const Entry = require("../models/posts");

exports.homepage = async(req,res) => {
    let entries = await Entry.find({})
    await res.render('index', {
        title: 'Food Blog | Tyler Duke Dev',
        entries
    });
};

the model:

const mongoose = require('mongoose');

const entrySchema = new mongoose.Schema({
    category: {
        type: String,
        required: true
    },
    title: {
        type: String,
        required: true
    },
    desc: {
        type: String,
        required: true
    },
    author: {
        type: String,
        required: true
    },
    dateCreated: {
        type: Date,
        required: true
    },
    readTime: {
        type: String,
        required: true
    }
})


const Entry = mongoose.model('Entry', entrySchema);

module.exports = Entry;

javascript

node.js

mongodb

heroku

ejs

0 Answers

Your Answer

Accepted video resources