Я развертываю свое приложение Angular и Postgres Express серверную часть на heroku, чтобы они могли общаться друг с другом. Большая проблема, с которой я сейчас сталкиваюсь, заключается в том, что всякий раз, когда я пытаюсь использовать методы выборки, он говорит, что мне нужен CORS или заголовок для него. Я уже установил его в моем express бэкэнде ниже:
const app = express();
const cors = require('cors');
const port = process.env.PORT || 5000;
const Pool = require('pg').Pool;
const transRoutes = require('./transactions');
const groupsRoutes = require('./budget-group');
const itemsRoutes = require('./budget_item');
const accRoutes = require('./account');
app.use(cors({origin: '*'})); //I also tried cors()
app.use(express.json());
app.use('/transactions', transRoutes);
app.use('/groups', groupsRoutes);
app.use('/items', itemsRoutes);
app.use('/accounts', accRoutes);
app.use(function (req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
next();
})
const pool = new Pool({
connectionString: process.env.DATABASE_URL,
ssl: {
rejectUnauthorized: false
}
});
app.get('/', (req, res) => {
res.send('Welcome to your server.');
});
app.get('/users', async (req, res) => {
try {
const getAllUsers = await pool.query("SELECT * FROM users");
res.json(getAllUsers);
} catch (err) {
console.log(err);
}
});
app.get('/login/:username/:password', async (req, res) => {
try {
const getUser = await pool.query("SELECT * FROM users WHERE username = $1 AND password = $2",
[
req.params.username,
req.params.password
]);
res.json(getUser.rows);
} catch (err) {
console.log(err);
}
});
//More routes omitted for brevity
app.listen(port, () => {console.log(`Listening on port ${port}`)});
Я думаю, что мой код подходит для бэкэнда, поэтому я чувствую, что код Angular является проблемой, но я не понять, как это исправить. Нужно ли мне вручную добавлять заголовок для каждого метода выборки, чтобы иметь функцию CORS, или мне нужно использовать какой-то прокси, который я нашел, но был слишком запутан, как это сделать?
Пример Метод выборки, который я сделал, приведен ниже:
fetch(`https://name-redacted.herokuapp.com/login/${this.username}/${this.password}`, {
method: 'GET',
headers: {'Content-Type': 'application/json'}
}).then(res => res.json())
.then(info => {
if (info.length === 0) {
this.failedAuth = true;
} else {
this.infoService.setUpLoginInfo(info[0]);
this.router.navigateByUrl('/instructions');
}
});
Также для развертывания части angular я следовал этому руководству: https://youtu.be/KVFrTf4VD2o Я просто подумал, что это может быть важно, поскольку он использует сервер express для передачи файлов вместо выполнения ng serve после сборки приложения.
Изменить: для ошибки CORS: доступ для выборки в 'https://app-backend.herokuapp.com/register' из источника 'https://app-project.herokuapp.com' был заблокировано политикой CORS: на запрошенном ресурсе отсутствует заголовок Access-Control-Allow-Origin. Если непрозрачный ответ соответствует вашим потребностям, установите режим запроса на 'no-cors', чтобы получить ресурс с отключенным CORS.
Заголовки: Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept Access-Control-Allow-Methods не отображается.