#javascript #function #promise #rest #node-promisify
#javascript #функция #обещание #остальное #узел-promisify
Вопрос:
я пробовал код обещания, но он всегда возвращает мне разрешение, даже если пользователь не существует в базе данных. может кто-нибудь помочь мне исправить мой код и оператор return в функции return второй консольный журнал работает только.
вот мой код
Вызов Api
const email = 't@t.com';
const request = require('request');
function IsUserExists(email, kc_accessToken) {
let url = `${path}/users?email=${email}`;
return new Promise(function (resolve, reject) {
request(
{
url: url,
headers: {
'content-type': 'application/json',
authorization: `Bearer ${kc_accessToken}`,
},
},
function (error, response, body) {
if (error) {
console.log('some error occured');
}
if (response.body.length > 0) {
console.log('User Exist');
return resolve();
}
console.log('Does not Exist');
return reject();
}
);
});
}
Вызов функции
http
.createServer(function Test() {
getAccessToken()
.then(function (response) {
kc_accessToken = response.data.access_token;
IsUserExists(email, kc_accessToken).then((resp) => {
if (resp) {
console.log('Do Not Create');
} else if (!resp) {
console.log('Creat a new User');
}
});
})
.catch(function (error) {
// handle error
console.log(error);
})
.then(function () {
// always executed
});
})
.listen(8081);
При предоставлении электронной почты пользователя, которая существует ( t@t.com )
При предоставлении электронной почты пользователя, которая не существует ( 09@t.com )
Комментарии:
1. Похоже
response.body.length >0
, что это всегда верно, независимо от того, существует пользователь или нет. Вам нужно выполнить собственную отладку, войдяconsole.log(response.body)
в систему в обоих случаях и посмотреть, какие данные у вас на самом деле есть.2. Кроме того,
return resolve()
разрешит обещание со значениемundefined
, которое не будет работать должным образом с вашим кодом в.then()
обработчике, который вы делаетеif(resp) {...}
, потомуresp
что там никогда не будет правдивым. Вам нужно изменить один из них.3. вы должны использовать like
resolve(response.body)
для возврата данных.4. Товарный знак. Поскольку вы обрабатываете эти данные как строку, поэтому «[]» и «[имя пользователя и т. Д.]» Имеют длину больше 0 («[]».длина равна 2, «[имя пользователя и т. Д.]» Может быть 10 или выше). Вам нужно использовать
JSON.parse
для анализа вашего response.body.5. Вот пример.
let a = "[]"; console.log(a.length)
будет два,let a = "[1,2,3]"; console.log(a.length)
будет 7. И после того, как вы используете JSON.parselet a = JSON.parse("[]"); console.log(a.length)
будет равен нулюlet a = JSON.parse("[1,2,3]"); console.log(a.length)
, будет три
Ответ №1:
Мне нужно создать новый ответ, например, на ваш вопрос в комментариях.
Теперь вы переходите в функцию отклонения, поэтому вам нужно обработать это отклонение снаружи.
if (response.body.length > 0) {
console.log('User Exist');
return resolve();
}
console.log('Does not Exist');
return reject(); // -> Now here you are
Вам нужно добавить .catch
функцию после IsUserExists.then()
.
Это будет IsUserExists.then().catch()
http.createServer(function Test() {
getAccessToken()
.then(function (response) {
kc_accessToken = response.data.access_token;
// here you only accept the data from resolve in Promise
// so you need to add .catch function to handle the rejection.
IsUserExists(email, kc_accessToken).then((resp) => {
if (resp) {
console.log('Do Not Create');
} else if (!resp) {
console.log('Creat a new User');
}
}).catch((error) => {
console.log(error)
});
})
.catch(function (error) {
// handle error
console.log(error);
})
.then(function () {
// always executed
});
})
.listen(8081);
Кстати, вы могли бы добавить параметр в функцию отклонения, например reject(new Error("user not found))
.
Затем снаружи вы можете получить это сообщение об отказе.
Комментарии:
1. хорошо. это работает. но теперь есть проблема, которую я хотел бы сделать, если пользователь не существует, тогда я хочу перейти к функции else if и выполнить метод create user, но в нашем случае он отклоняет и переходит в catch, поэтому я не думаю, что смогу написать свой метод create внутри этого
2. Вы можете использовать resolve в обеих ситуациях. Если use существует, разрешите (true), если use не существует, разрешите (false). Отклонений больше нет. Затем вы можете получить
true
илиfalse
вIsUserExists(email, kc_accessToken).then((resp) => {console.log(resp) // true or false })
.