Развертывание приложения в Heroku выдает ошибку { path=“/” path=“/favicon.ico” }. Но выполняется на локальном хосте

#javascript #node.js #mongodb #heroku

#javascript #node.js #mongodb #heroku

Вопрос:

Я пытаюсь развернуть свое приложение в Heroku. Я получаю ошибку 503 (служба недоступна), даже если она выполняется на локальном хосте. Я перепробовал много решений, но ни одно из них не работает. Мой app.js файл

 if (process.env.NODE_ENV !== "production") {
  require("dotenv").config();
}

const express = require("express");
const mongoose = require("mongoose");
const { ApolloServer } = require("apollo-server-express");
const auth = require("./middleware/auth");
const userController = require("./controllers/userController");
const typeDefs = require("./schema");
const resolvers = require("./resolvers");

const port = process.env.PORT || 4000;
const app = express();
app.set("port", port);

app.use((req, res, next) => {
  res.setHeader("Access-Control-Allow-Origin", "*");
  res.setHeader(
    "Access-Control-Allow-Methods",
    "OPTIONS, GET, POST, PUT, PATCH, DELETE"
  );
  res.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization");
  next();
});

app.use(auth);
app.get("/email-confirmation/:token", userController.confirmationPost);

const server = new ApolloServer({
  typeDefs,
  resolvers,
  formatError: (err) => {
    if (!err.originalError) {
      return err;
    }
    if (err.message.startsWith("Database Error: ")) {
      err.message = "Internal server error";
    }
    const data = err.originalError.data;
    const message = err.message || "Internal server error.";
    const code = err.originalError.code || 500;
    return { message: message, status: code, data: data };
  },
  context: ({ req, res }) => ({
    req,
    res,
  }),
});

server.applyMiddleware({ app });

mongoose
  .connect(process.env.DB_URL, {
    useNewUrlParser: true,
    useUnifiedTopology: true,
    useCreateIndex: true,
  })
  .then(() => {
    console.log("conneted to database");
    app.listen(port, () => {
      console.log("listening for requests on port "   port);
    });
  }); 

И мой package.json:

 {
  "name": "server",
  "version": "1.0.0",
  "description": "",
  "main": "app.js",
  "scripts": {
    "test": "echo "Error: no test specified" amp;amp; exit 1",
    "start": "node app.js",
    "dev": "nodemon app.js"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "apollo-server-express": "^2.17.0",
    "bcryptjs": "^2.4.3",
    "crypto": "^1.0.1",
    "express": "^4.17.1",
    "graphql": "^15.3.0",
    "jsonwebtoken": "^8.3.0",
    "mongoose": "^5.10.2",
    "nodemailer": "^6.4.16",
    "nodemailer-sendgrid-transport": "^0.2.0",
    "validator": "^10.8.0"
  },
  "devDependencies": {
    "dotenv": "^8.2.0",
    "eslint": "^7.7.0",
    "nodemon": "^2.0.6"
  }
} 

команда heroku logs —tail выдает следующий вывод:
скриншот

Я перепробовал все решения. Но ни один из них, похоже, не решает проблему. Пожалуйста, помогите.

Обновить:

После того, как я настроил DB_URL в Heroku, он начал работать, но я получаю другую ошибку. скриншот2

Консоль:

 1. GET https://capstone-ecommerce-backend.herokuapp.com/ 404 (Not Found)
2. Refused to load the image 'https://capstone-ecommerce-backend.herokuapp.com/favicon.ico' because it violates the following Content Security Policy directive: "default-src 'none'". Note that 'img-src' was not explicitly set, so 'default-src' is used as a fallback. 

Комментарии:

1. Вы установили DB_URL раздел «Переменные среды Heroku» в разделе?

Ответ №1:

Попробуйте настроить DB_URL в своем приложении Heroku. Используйте следующую команду:

 $ heroku config:set DB_URL=database_uri_here
 

Комментарии:

1. да, после того, как я установил DB_URL, он работает, но я получаю другую ошибку. 1. «ПОЛУЧИТЬ capstone-ecommerce-backend.herokuapp.com 404 (Не найден)» 2. «Отказано в загрузке изображения ‘ capstone-ecommerce-backend.herokuapp.com/favicon.ico «потому что это нарушает следующую директиву политики безопасности контента: «default-src ‘none'». Обратите внимание, что ‘img-src’ явно не был задан, поэтому ‘default-src’ используется в качестве запасного варианта. »

2. Попробуйте настроить корневой URL ( / )

3. Будет лучше, если вы сможете создать отдельный вопрос для этого 🙂