NodeJS, почему моя функция не будет вызываться внутри моего оператора IF/Else

#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 });