Как справиться с обещанием получения без вложенных обратных вызовов? - PullRequest
0 голосов
/ 04 октября 2018

Я думаю, что fetch возвращает обещание.Но как мне справиться с этим красиво?Код ниже не совсем работает.Я получаю {message: "Internal server error custom: TypeError: Cannot read property 'then' of undefined"}.

exports.handler = (event, context, callback) => {
    try {
        getDiscourseId(username, callback).then((userId) => {
            callback(null, {
                statusCode: 200,
                headers: {},
                body: JSON.stringify({
                    userId: userId
                })
            });
        });

    } catch (error) {
        callback(null, {
            statusCode: 500,
            headers: {},
            body: JSON.stringify({
                message: "Internal server error custom: " + error
            })
        });
    }
};

function getDiscourseId(username) {
    console.log({username: username, discourseApiKey: discourseApiKey, discourseApiUser: discourseApiUser})
    fetch(`https://${domain}/users/${username}.json?api_key=${discourseApiKey}&api_username=${discourseApiUser}`, {
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded',
            'Accept': 'application/json'
        },
        method: 'GET',
    })
    .then(response => {
        return response.json();
    })
    .then(data => {
        if (data) {
            return data.user.id; 
        }
    })
    .catch(err => {
        return {err: err};
    });
}

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Вы получаете эту ошибку, потому что ваша функция getDiscourseId не возвращает значение.

Если вы добавите ключевое слово return перед вашим вызовом fetch(...), вы должны начать двигаться вперед..

Возможно, вы также захотите удалить .catch изнутри getDiscourseId и вместо этого добавить его в конец вызова до getDiscourseId внутри вашего обработчика:

exports.handler = (event, context, callback) => {
    getDiscourseId(username)
        .then((userId) => {
            callback(null, {
                statusCode: 200,
                headers: {},
                body: JSON.stringify({
                    userId: userId
                })
            });
        })
        .catch(error => {
            callback(null, {
                statusCode: 500,
                headers: {},
                body: JSON.stringify({
                    message: "Internal server error custom: " + error
                })
            });
        });
};

function getDiscourseId(username) {
    console.log({username: username, discourseApiKey: discourseApiKey, discourseApiUser: discourseApiUser})
    return fetch(`https://${domain}/users/${username}.json?api_key=${discourseApiKey}&api_username=${discourseApiUser}`, {
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded',
            'Accept': 'application/json'
        },
        method: 'GET',
    })
    .then(response => {
        if (!response.ok) { // h/t TJ Crowder
            throw new Error("Failed with HTTP code " + response.status);
        }
        return response.json();
    })
    .then(data => {
        if (data) {
            return data.user.id;
        }
    });
}

РЕДАКТИРОВАТЬ: TJ Crowder правильно, что вы, вероятно, хотите обрабатывать ответы 4xx и 5xx как полные ошибки.Я бесстыдно украл его пример кода из его блога и добавил его к вышесказанному.

0 голосов
/ 05 октября 2018

Остановитесь, когда вы вернете response.json ().Это возвращает обещание, для которого можно использовать .then.

Вы возвращаете userId, для которого .then нельзя использовать.

Если вы остановитесь на return response.json (), вы можете использовать уже существующий оператор '.then (data.user.id => ...).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...