Я делаю HTTPS-запрос с другого компьютера на сервер node.js (v.13.7.0), работающий в Ubuntu 16.04. Прежде чем выполнить «важный» код на сервере, я хочу проверить авторизацию, посмотрев на OAuth-токен, переданный на сервер. Это требует еще одного HTTPS-вызова ко второму серверу, чтобы определить действительность токена. Очевидно, мой код асинхронный, так как основная часть кода не блокируется, пока выполняется внутренний вызов для проверки токена OAuth (функция validateToken). Мой код здесь:
function validateToken(environment, oauthToken) {
var url = require('url');
var https = require('https');
var fs = require('fs');
var port = 443;
// This line is from the Node.js HTTPS documentation.
var options = {
key: fs.readFileSync('./certificates/client-key.pem'),
cert: fs.readFileSync('./certificates/client-cert.pem')
};
function validateToken(environment, oauthToken) {
var url = "https://verify-the-token?token=oauthToken";
https.get(url, (response) => {
console.log("is token valid? " + response.statusCode);
return (response.statusCode == 200);
});
}
https.createServer(options, function(request, response) {
var body = "";
var queryParam = url.parse(request.url, true).query.command;
if (queryParam != undefined) {
authToken = request.headers['fmrauthorization'];
environment = request.headers['environment'];
validToken = validateToken(environment, authToken); // This executes, but asynchronously.
response.setHeader('Content-Length', Buffer.byteLength(body));
response.setHeader('Content-Type', 'text/plain');
// Even if validateToken returns 'true', these blocks below will have already executed
// and evaluated the return value as 'false':
if (validToken == true) {
if (queryParam == "run") {
// Ok, cool. go do important stuff now...
response.statusCode = 200;
response.end(body);
}
else {
response.statusCode = 400;
response.end(body);
}
}
else {
console.log("Token check returned false.");
body = "Unauthorized";
response.statusCode = 401;
response.end(body);
}
}
else {
body = "No command received. Please check the request.";
response.statusCode = 400;
response.end(body);
}
}).listen(port);
console.log("I'm listening on port " + port);
Я пытался определить, являются ли операторы стрелки по своей сути асинхронными (документация node.js, похоже, не указывает на это, если я что-то не пропустил), или если моя реализация самого сервера должна быть изменена. Я также попытался async / await на функцию validateToken () безуспешно. Очевидно, я новичок в node.js и мог бы использовать некоторые рекомендации. Спасибо.