# #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 файл, вероятно, не является файлом json2. Это то, что я тоже подозреваю. Как обернуть необработанное содержимое и обработать его в формате 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")