Как обработать обещание с обратным вызовом с помощью nodejs? - PullRequest
0 голосов
/ 06 апреля 2019

Я делаю приложение, используя модуль 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, но вторая часть не распознает значение «response» и строку «return response»; на самом деле не возвращает, я подтвердил это почтальоном (он не получил ответа).

Я думаю, что проблема в том, что я неправильно обрабатываю синтаксис .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"}

Это означает, что код не попадает в функцию обратного вызова (он не печатает объекты 'fail' или 'ok')

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

1 Ответ

1 голос
/ 06 апреля 2019

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

Это не то, как ошибки обрабатываются в обещаниях.then обратный вызов имеет 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',
    }
}
...