Я изучаю nodejs и пытаюсь сделать вызов API. API использует JWT для аутентификации.
Я создал эти функции для подписи токена:
function token() {
const payload = {
iat: Math.floor(new Date() / 1000),
exp: Math.floor(new Date() / 1000) + 30,
sub: "api_key_jwt",
iss: "external",
jti: crypto.randomBytes(6).toString("hex")
};
return new Promise((resolve, reject) => {
jwt.sign(payload, privatekey, { algorithm: "RS256" }, function(
err,
token2
) {
if (err) reject(err);
else resolve(token2);
});
});
}
exports.genToken = async function() {
const header = {
"x-api-key": api
};
const data = {
kid: api,
jwt_token: await token()
};
async function authorization(req, res) {
try {
const auth = await rp({
url: authurl,
method: "POST",
headers: header,
body: data
});
res.send(auth.body);
} catch (error) {
res.send(404).send();
}
}
return {
"x-api-key": api,
Authorization: "Bearer " + authorization()
};
};
Это прекрасно работает. Затем я создал функцию для вызова API:
const token = require("./index").genToken;
const rp = require("request-promise");
exports.getOrderBook = function(res, error) {
const full_url = url + "order_book";
const auth = token();
rp({
url: full_url,
method: "GET",
headers: auth,
body: {
market: "btceur"
},
json: true
})
.then(function(response) {
res(response);
})
.catch(function(err) {
error(err);
});
};
И я называю это с помощью Express:
routes.get("/orderbook", async (req, res, next) => {
try {
const book = await orders.getOrderBook();
res.send(book);
} catch (error) {
next(error);
}
});
Однако, когда я вызываю свой API, он показывает ошибку в консоли:
TypeError [ERR_INVALID_ARG_TYPE]: The first argument must be one of type string or Buffer. Received type object.
Я предполагаю, что ошибка связана с генерацией токена, потому что, если я console.info(auth) в функции getOrderBook, он показывает Promise { <pending> }, поэтому, вероятно, объект передается как токен jwt.
Это действительно проблема? Я пробовал много разных решений, которые нашел в Интернете, однако концепция Async/Await для меня нова, и у меня возникли некоторые проблемы, чтобы понять ее.
Заранее большое спасибо, ребята!



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Поскольку getToken — это функция anync, возврат также заключен в Promise, поэтому вам понадобится еще один anync/await:
exports.getOrderBook = async function() {
let response;
try {
const full_url = url + "order_book";
const auth = await token();
response = await rp({
url: full_url,
method: "GET",
headers: auth,
body: {
market: "btceur"
},
json: true
});
} catch (e) {
// handle error
throw e
// or console.error(e)
}
return response;
};
В этой строке также Authorization: "Bearer " + authorization(), authorization возвращает обещание
const bearer = await authorization()
return {
"x-api-key": api,
Authorization: "Bearer " + bearer
};
Для обработки ошибок оберните все это в блок try..catch
exports.genToken = async function() {
try {
const header = {
"x-api-key": api
};
const data = {
kid: api,
jwt_token: await token()
};
async function authorization(req, res) {
let auth;
try {
auth = await rp({
url: authurl,
method: "POST",
headers: header,
body: data
});
// res object not available
// res.send(auth.body);
} catch (error) {
// res object not available, better throw error and handle in your middleware
// res.send(404).send();
}
return auth
}
const bearer = await authorization()
} catch (e) {
// handle error
}
return {
"x-api-key": api,
Authorization: "Bearer " + bearer
};
}
можешь вставить трассировку стека
Я внес некоторые изменения в код. Теперь я больше не получаю эту ошибку, однако мой токен auth вложен в JSON. Когда я пытаюсь выполнить console.info авторизацию, я получаю следующее: { 'x-api-key': 'xxxxxxxxx', Authorization: 'Bearer [object Object]' } Итак, я думаю, проблема в том, как я обрабатываю ответ из функции genToken
вы должны извлечь в этом случае
auth["токен"] решил проблему! Еще раз спасибо за помощь. Поскольку я извлек и скорректировал код на основе вашего ответа, я отмечу его как решение. Спасибо!
Я пробовал это, прежде чем задавать вопрос, однако я все еще получаю ту же ошибку