1

Я пишу соцсеть (и вот не надо докапываться, что я пишу её на чистом JS), и мне нужна функция, которая будет загружать посты из базы, подобно ленте. У меня есть функция "loadImportantPosts", которая загружает "важные" посты (что-то по типу рекламы, только идёт в первую очередь). Мне нужно установить всего-то два заголовка: Access-Control-Allow-Origin: * и Content-Type: application/json, но метод "setRequestHeader" — это такая гадость! Устанавливает от силы один заголовок, когда МНЕ НУЖНО ДВА!!!

Прошу помочь мне в решении данного вопроса.

Если что, код прикреплён ниже:

function loadImportantPosts() {
    xhr.open('POST', 'http://188.120.244.235:25565/junytwork_api/get_important_posts', false);
    xhr.setRequestHeader('Access-Control-Allow-Origin', '*');
    xhr.send({
        login: localStorage.login,
        password: localStorage.password
    });
const object = JSON.parse(xhr.responseText);

if(object.success) {
    const posts = object.posts;
    posts.forEach((el) => {
        document.getElementById('feed').innerHTML = `<div class="post">
        <div class="post-top-bar">
            <div class="author-name">${el.authorLogin}</div>
            <br>
            <hr>
        </div>
        <br><br><br><br>
        <div class="post-text">${el.text}</div>
        <br><hr>
        <div class="post-likes-count">❤ ${el.likes.split('|').length.toLocaleString('ru')}</div>
    </div>`
    });
    return 'ok';
}

if(!object.success && object.error.code == 1) {
    alert('Ошибка: в запросе недостаточно параметров.');
    return 'error';
}

if(!object.success && (object.error.code == 2 || object.error.code == 4)) {
    alert('Ошибка авторизации. Сейчас вы будете перенаправлены на страницу входа.');
    return 'error';
}

if(!object.success && object.error.code == 5) {
    alert('Не было найдено важных постов.');
    return 'error';
}

}

Qwertiy
  • 123,725
  • Но ведь можно вызывать setRequestHeader() сколько угодно раз с разными именами и значениями заголовков. – vsemozhebuty Jan 11 '21 at 23:03
  • Тогда странно, почему я не могу установить Content-Type и Access-Control-Allow-Origin сразу. – Андрей Июньский Jan 11 '21 at 23:06
  • @АндрейИюньский, потому что они там лишние. Возможно на них какие-то ограничения распространяются. – Qwertiy Jan 11 '21 at 23:07
  • Превеликий оракул-модератор, вылавливаю я такой в консоли тело запроса (то самое, что указано в xhr.send), а возвращается пустой объект! и чо делать(( – Андрей Июньский Jan 11 '21 at 23:09
  • @АндрейИюньский, я же написал в ответе. Добавлять заголовки не в запрос, а в ответ. – Qwertiy Jan 11 '21 at 23:16
  • ну, я так и делаю, а помимо того, что возвращается пустой объект, Content-Type не тот, что мне нужен – Андрей Июньский Jan 11 '21 at 23:18
  • сюда можно как-то скриншот прикрепить? – Андрей Июньский Jan 11 '21 at 23:21
  • @АндрейИюньский, у меня нет причин считать, что ты это делаешь. Кода api в вопросе вообще нет, а вот запихивание заголовка в запрос есть. Если ты действительно добавляешь заголовок в ответ, покажи скриншот соответствующего ответа на вкладке network в девтулах. И не забывай звать через @, а то уведомление не приходит. – Qwertiy Jan 11 '21 at 23:22
  • @АндрейИюньский, скриншот можно приложить к сообщению. Нажми править и ctrl+v. Если не хочешь добавлять в сообщение, скопируй получившуюся ссылку в комментарий и отмени изменение. – Qwertiy Jan 11 '21 at 23:23
  • https://sun9-53.userapi.com/impg/81O4LC0uHtOdKRchliQCmnx66my1nTFoY2qGgw/_URTGo4VAMg.jpg?size=579x431&quality=96&proxy=1&sign=81240ff2c1f03ed2b29100a07291de33&type=album

    тут скриншот, осторожно. кусается))

    @Qwertiy

    – Андрей Июньский Jan 11 '21 at 23:24
  • @АндрейИюньский, я просил заголовки ответа. – Qwertiy Jan 11 '21 at 23:25
  • @Qwertiy HTTP/1.1 200 OK X-Powered-By: Express Access-Control-Allow-Origin: * Content-Type: application/json; charset=utf-8 Content-Length: 162 ETag: W/"a2-W6W50IO0qJ3VlD3hGe2XnTSTqRo" Date: Mon, 11 Jan 2021 23:22:19 GMT Connection: keep-alive – Андрей Июньский Jan 11 '21 at 23:27
  • @АндрейИюньский, а что хром в консоли пишет на это? – Qwertiy Jan 11 '21 at 23:33
  • @Qwertiy а что он должен писать? я вижу только, что сервер возвращает "text/plain;charset=UTF-8", когда я прошу его вывести в консоль заголовок "Content-Type" – Андрей Июньский Jan 11 '21 at 23:36
  • мда тяжёлый случай – Андрей Июньский Jan 11 '21 at 23:36
  • @АндрейИюньский, если ты нарушаешь CORS, то хром сам пишет ошибку в консоль, в которой говорится, что именно нарушено. Если ты не нарушаешь CORS, то ошибка в чём-то другом и стоит попробовать отладчик. – Qwertiy Jan 12 '21 at 00:22
  • Кстати, вот: https://ru.stackoverflow.com/q/554290/178988 и не надо издеваться над синхронным запросом. – Qwertiy Jan 12 '21 at 00:24
  • @Qwertiy, чел, мне всё равно спокойнее синхронные запросы делать, но тем не менее, спасибо. программер из меня пока что не такой опытный, так что я рад всякой информации относительно программирования. кстати, мне удалось сделать то, что я хотел, так что мой вопрос закрыт, удачного дня! – Андрей Июньский Jan 12 '21 at 08:07

1 Answers1

2

Эти заголовки должен устанавливать не сайт, а сервер, отдающий ему ответ. От установки заголовков запроса толку нет, даже наоборот есть вероятность, что они будут мешать.

Qwertiy
  • 123,725