Как обрабатывать обещание с обратным вызовом с помощью nodejs?

Я делаю приложение, используя модуль nano npm с nodejs, одна из моих асинхронных функций предназначена для создания объекта в Cloudant, но я не совсем уверен, как обрабатывать Promise.resolve с обратным вызовом, который является важной частью ответ, который предполагается, должен ответить мой сервер.

Я хорошо справляюсь с созданием документа, но следующая часть — проверить, была ли ошибка при попытке сделать это, поэтому, если есть ошибка, я бы хотел, чтобы мой сервер возвращал объект с классическим сообщением об ошибке.

Это мой код:

exports.createMeeting = async (body) => {
var response;
object = {"name": "Billy Batson"}
console.log("-------------")

//Trying to insert the document
response = await Promise.resolve(db.insert(object).then((body, err) => {
        //This is the part I'm trying to check if the db.insert did fail
        if (err) {
            response = {
                message: 'Failure',
                statusCode: '500',
            }
            console.log(JSON.stringify(response));
        } else {
            response = {
                message: 'Ok',
                statusCode: '201',
            }
            console.log(JSON.stringify(response));
        }
    }));
}
console.log("******* ", JSON.stringify(response));
return response;

}

Если я попытаюсь запустить этот код, вывод будет:

-------------
{"message":"Ok","statusCode":"201"}
*******  undefined

Первый напечатанный объект связан с тем, что код достиг той части, где я присваиваю объекту ответа код состояния 201, но вторая часть не распознает значение «ответ» и строку «возврат ответа;» на самом деле не возвращает, я подтвердил это с почтальоном (он не получает ответа).

Я думаю, что проблема здесь в том, что я неправильно обрабатываю синтаксис .then(), я попытался перейти на классический обратный вызов с помощью:

response = await Promise.resolve(db.insert(object),(body, err) => {
    if (err) {
        response = {
            message: 'Failure',
            statusCode: '500',
        }
        console.log(JSON.stringify(response));
    } else {
        response = {
            message: 'Ok',
            statusCode: '201',
        }
        console.log(JSON.stringify(response));
    }
});

Но печатает:

-------------
*******  {"ok":true,"id":"502c0f01445f93673b06fbca6e984efe","rev":"1-a66ea199e7f947ef40aae2e724bebbb1"}

Это означает, что код не попадает в обратный вызов (он не печатает объекты «сбой» или «хорошо»)

Что мне здесь не хватает? :(


person Rodolfo BocaneGra    schedule 06.04.2019    source источник
comment
вы можете использовать обратный вызов или обертку обещания. что это за функция db.insert(object),(body, err)?   -  person 1565986223    schedule 06.04.2019


Ответы (1)


nano предоставляет API на основе обещаний, когда обратный вызов опущен.

Это не то, как ошибки обрабатываются в промисах. then callback имеет 1 параметр, err не будет.

Ожидается, что обещание будет отклонено в случае ошибки. Promise.resolve является избыточным, когда уже есть обещание, и всегда избыточным с async..await.

Так должно быть:

try {
    const body = await db.insert(object);
    response = {
        message: 'Ok',
        statusCode: '201',
    }
} catch (err) {
    response = {
        message: 'Failure',
        statusCode: '500',
    }
}
person Estus Flask    schedule 06.04.2019