Home > OS >  Strapi returns 404 for custom route only when deployed to Heroku
Strapi returns 404 for custom route only when deployed to Heroku

Time:09-09

I have created a custom route in Strapi v4 called "user-screens". Locally I hit it with my FE code and it returns some data as expected. However when I deploy it to Heroku and attempt to access the endpoint with code also deployed to Heroku it returns a 404. I've tailed the Heroku logs and can see that the endpoint is hit on the server side, but the logs don't give anymore info other than it returned a 404.

I am doing other non custom route api calls and these all work fine on Heroku. I am able to auth, save the token, and hit the api with the JWT token and all other endpoints return data. This is only happening on my custom route when deployed to Heroku. I've set up cors with the appropriate origins, and I am wondering if I need to add something to my policies and middlewares in the custom route. I have verified the permissions and verified the route is accessible to authenticated users in the Strapi admin.

Here is my route:

module.exports = {
  routes: [
    {
      method: "GET",
      path: "/user-screens",
      handler: "user-screens.getUserScreens",
      config: {
        policies: [],
        middlewares: [],
      },
    },
  ],
};

And my controller:

"use strict";

/**
 * A set of functions called "actions" for `user-screens`
 */

module.exports = {
  getUserScreens: async (ctx) => {
    const user = ctx.state.user;

    if (!user) {
      return ctx.badRequest(null, [
        { messages: [{ id: "No authorization header was found" }] },
      ]);
    }

    strapi.entityService
      .findMany("api::screen.screen", {
        owner: user.id,
        populate: ["image"],
      })
      .then((result) => {
        ctx.send(result);
      });
  },
};

CodePudding user response:

For anyone facing this, the answer was to change how I returned the ctx response from a 'send' to a 'return' from the controller method. I am not sure why this works locally and not on Heroku, but this fixes it:

New controller code:

module.exports = {
  getUserScreens: async (ctx) => {

    const user = ctx.state.user;
    if (!user) {
      return ctx.badRequest(null, [
        { messages: [{ id: "No authorization header was found" }] },
      ]);
    }

    return strapi.entityService
      .findMany("api::screen.screen", {
        owner: user.id,
        populate: ["image"],
      })
      .then((result) => {
        return result;
      })
      .catch((error) => {
        return error;
      });
  },
};
  • Related