#node.js
Вопрос:
У меня есть вопрос, касающийся узла и вызова функции внутри операторов if/else. Ниже приведена моя ситуация. Я не уверен, почему вызов функции awscredsработает с первого оператора IF, но он не работает, когда я пытаюсь вызвать его из оператора else. Имеет ли это какое-то отношение к тому факту, что у меня есть if/else внутри оператора else?
let cacheExpiration; let currentTime; let awsCredentials; async function stsGetCallerIdentity(creds, message) { const stsParams = { credentials: creds }; // Create STS service object const kinesis = new AWS.Kinesis(stsParams); const parsed_value = JSON.parse(message); const type = parsed_value.type; console.info(type); const message_type = { "transcript": process.env.TRANSCRIPT_KINESIS, "tone": process.env.TONE_KINESIS, "pitch": process.env.PITCH_KINESIS }; const stream_name = message_type[type]; console.info(stream_name); const params = { Data: Buffer.from(message), PartitionKey: `1111`, StreamName: stream_name }; kinesis.putRecord(params, function(err, data) { if (err) console.error(err); else { console.info(JSON.stringify(data)); } }); } function awsCreds() { return new Promise((resolve, reject) =gt; { const roleToAssume = { RoleArn: process.env.IAMRole, RoleSessionName: `session1`, DurationSeconds: 900 }; sts.assumeRole(roleToAssume, function(err, data) { if (err) { console.error(err, err.stack); reject(err.stack); } else { awsCreds = { accessKeyId: data.Credentials.AccessKeyId, secretAccessKey: data.Credentials.SecretAccessKey, sessionToken: data.Credentials.SessionToken, cacheExpiration: data.Credentials.Expiration }; resolve(awsCreds); } }); }); }; webSocketClient.on(`message`, async (message) =gt; { try { currentTime = new Date(); console.log(`currentTime`, currentTime); console.log(`cacheExpiration`, cacheExpiration); if (cacheExpiration == undefined) { //Calling awsCreds returns values. awsCredentials = await awsCreds(); stsGetCallerIdentity(awsCredentials, message) } else { const minutes = (cacheExpiration.getTime() - currentTime.getTime()); console.log(`minutes`, minutes); if (minutes gt; 60000) { //Do something stsGetCallerIdentity(awsCredentials, message) } else { // Calling awsCreds from here returns error 'awsCreds is not a function'. console.log(`Refreshing credentials`); awsCredentials = await awsCreds(); stsGetCallerIdentity(awsCredentials, message) } } } catch (error) { console.error(`There was an error`, error); }; )};
Комментарии:
1. Обычно это работало бы нормально. Я подозреваю, что есть проблема за пределами этого фрагмента кода. Вы
awsCreds
случайно где-то переосмысливаете?2. Нам нужно увидеть больше кода, потому что то, о чем вы говорите, происходит не только с этим кодом. Пожалуйста, покажите, где
awsCredentials
определено, и покажите, чтоawsCreds()
делает функция, и покажите остальную часть этого тела функции.3. Я добавил остальную часть кода, я не переопределяю awsCreds, я вызываю его только дважды, сначала один раз, когда значение cacheExiration не определено, а затем, когда истек срок действия, в течение которого мне нужно обновить учетные данные. В последнем случае происходит сбой, когда срок действия TTL истек. Надеюсь, это поможет, и еще раз спасибо, что посмотрели на это для меня.
4. Что ж, я чувствую себя идиотом, упуская очевидное. Большое спасибо, ребята, за то, что выяснили эту проблему.
Ответ №1:
Ваша функция вызывается awsCreds
, а затем вы назначаете awsCreds
в качестве литерала объекта перед собой resolve
, вам нужно const
впереди, или вообще не назначайте, просто поместите объект внутрь.:
Изменить
awsCreds = { accessKeyId: data.Credentials.AccessKeyId, secretAccessKey: data.Credentials.SecretAccessKey, sessionToken: data.Credentials.SessionToken, cacheExpiration: data.Credentials.Expiration }; resolve(awsCreds);
Для
resolve({ accessKeyId: data.Credentials.AccessKeyId, secretAccessKey: data.Credentials.SecretAccessKey, sessionToken: data.Credentials.SessionToken, cacheExpiration: data.Credentials.Expiration });