#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, он начал работать, но я получаю другую ошибку.
Консоль:
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. Будет лучше, если вы сможете создать отдельный вопрос для этого 🙂