Я пытаюсь получить токен с помощью jsonwebtoken из моего api в мой реагирующий компонент, но я не могу получить его со стороны клиента, однако я думаю, что все на стороне сервера кажется нормальным.
API:
router.post("/api/user/login", async (ctx, next) => {
var nickname = ctx.request.body.data.nickname;
var password = ctx.request.body.data.password;
var user = await db.collection("tmp_users").find({nickname: nickname}).toArray();
var token = "";
if (user.length > 0) {
const hashPassword = user[0].password;
bcrypt.compare(password, hashPassword)
.then((res) => {
if (res) {
jwt.sign({ user: user}, "test", (err, res) => {
console.info("token GOOD => ", res);
ctx.body = res;
return res;
});
}
});
}
console.info("token FAILED => ", token);
ctx.body = token;
return token;
});
а вот часть клиентской части с аксиомами:
axios.post("/api/user/login", { data })
.then(res => {
console.info("res =>", res);
console.info("res data =>", res.data);
console.info("res token => ", res.token);
console.info("res data token =>", res.data.token);
});
вопрос: где найти токен? на стороне сервера консоль журнала в порядке. но на стороне клиента я потерялся, я не могу его найти.
Может я чего-то не понял? Спасибо за помощь !
да, извини, но даже если я вернусь, я ничего не получу
просто верни обещание
Я использую koa, когда вы хотите вернуть, вы используете «ctx.body = value», это эквивалентно «res.json ()» с экспресс
Пробую "вернуть разрешение" тоже не работает ...
это обратный вызов, который вызывает у вас проблемы. Ваша функция возвращается до того, как токен станет доступен для добавления в ответ





Он не возвращает никакого значения, потому что вы возвращаете внутри обещания, которое является асинхронным. Я написал альтернативный подход, который библиотеки (bcrypt / jwt) предоставляют для синхронной работы.
router.post("/api/user/login", async (ctx, next) => {
var nickname = ctx.request.body.data.nickname;
var password = ctx.request.body.data.password;
var user = await db.collection("tmp_users").find({nickname: nickname}).toArray();
var token = "";
if (user.length > 0) {
const hashPassword = user[0].password;
const res = await bcrypt.compare(password, hashPassword);
if (res) {
const jwttoken = await jwt.sign({ user: user}, "test")
console.info("token GOOD => ", jwttoken);
ctx.body = jwttoken;
return jwttoken;
}
}
return new Error("Error");
});
Я бы просто предостерегал. Не одобряется выполнение любой синхронной работы в среде узлового типа. bcrypt.compareSync - это функция блокировки. Вместо этого замените его асинхронной альтернативой, такой как const res = await bcrypt.compare(password, hashPassword);. Вот ссылка на проблему блокировки nodejs.org/en/docs/guides/blocking-vs-non-blocking.
Спасибо @skellertor за предложение. Я его обновил.
Не похоже, что вы когда-либо возвращали что-либо на стороне сервера. Какой фреймворк вы используете на стороне сервера?