Отклонено обещание с синтаксической ошибкой: Неожиданный токен i в JSON в позиции 0 при извлечении необработанного файла из Gitlab

# #javascript #vue.js #gitlab

Вопрос:

Я пытаюсь извлечь необработанный файл из репозитория Gitlab, следуя официальной документации.

Эти функции заключаются в следующем:

   methods: {
    async getProjects(url, method, payload) {
      const token = this.$store.getters.token
      const headers = {
        'Content-Type': 'application/json',
        'Private-Token': token
      }

      const response = await fetch(url, {
        method: method,
        headers: headers,
        body: JSON.stringify(payload)
      })
      return response.json()
    },
    [...]
    async addNewProject() {
      const payload = {
        "name": "newProjectName",
        "namespace_id": 12,
        "description": "description"
      }
      
      this.getProjects("https://gitlab.example.com/api/v4/projects/", "POST", payload)
        .then(data => {
          console.log(data.id)
        })
        .catch((e) => {
          console.error(e)
        })
        
      let rawFile = null
        try {
          rawFile = await JSON.parse(this.getProjects("https://gitlab.example.com/api/v4/projects/1/repository/files/readme.md/raw?ref=master", "GET"))
        } catch (e) {
          rawFile = this.getProjects("https://gitlab.example.com/api/v4/projects/1/repository/files/readme.md/raw?ref=master", "GET")
        }
      console.log(rawFile)
    }
  }
 

Регистрация rawFile показывает объект ожидающего обещания с отклоненным состоянием и SyntaxError как в заголовке.

Возможно ли, что необработанный формат файла вызывает эту ошибку? Если да, то как это предотвратить?

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

1. raw получает фактическое содержимое файла, верно? В readme.md файл, вероятно, не является файлом json

2. Это то, что я тоже подозреваю. Как обернуть необработанное содержимое и обработать его в формате JSON?

3. на самом деле… это немного запутанно. Вам нужно await сделать это при вызове getProjects , так как это асинхронная функция

4. и похоже, что вы дважды анализируете json.

5. и gitlab.example.com не существует, так что вы не получите от этого никаких результатов.

Ответ №1:

Есть несколько вещей, которые происходят.

  • gitlab.example.com не существует, поэтому трудно понять, какие результаты вы на самом деле получаете
  • Вы передаете обещание JSON.parse . Вам нужно использовать await или then использовать ответ:
  • Конец ваших getProjects вызовов response.json() , которые будут анализировать json. Вам не нужно разбирать его снова.

Как насчет использования:

 let rawFile = await this.getProjects("https://gitlab.example.com/api/v4/projects/1/repository/files/readme.md/raw?ref=master", "GET")
 

Если ответ есть json , это даст вам объект, но если ответ не json, вы хотите использовать response.text() вместо него. Вам понадобится другая функция:

 async getTextFile(url) {
      const token = this.$store.getters.token
      const headers = {
        'Private-Token': token
      }

      const response = await fetch(url, {
        method: "GET",
        headers: headers
      })
      return response.text()
    }
 

тогда назови это так:

 let rawFile = await this.getTextFile("https://gitlab.example.com/api/v4/projects/1/repository/files/readme.md/raw?ref=master")