slack-бот, отправляющий прямое сообщение пользователю с помощью функции aws lambda

#javascript #asynchronous #aws-lambda #async-await #slack-api

#javascript #асинхронный #aws-lambda #асинхронный -ожидание #slack-api

Вопрос:

Я пытаюсь отправить прямое сообщение с помощью slack web api пользователю, но я думаю, что мой метод getSlackUser, который получает всех доступных пользователей, не завершается вовремя, когда я вызываю slackId;

console.log(slackId) дает неопределенное значение, что он не завершает мой вызов api с помощью bolt

как мне обеспечить завершение метода getSlackUser (сделать его блокирующим), прежде чем он перейдет к остальным?

 const { WebClient } = require('@slack/web-api');
const { App } = require('@slack/bolt')

const rtm = new RTMClient(process.env.SLACK_OAUTH_TOKEN);
const web = new WebClient(process.env.SLACK_OAUTH_TOKEN);
const app = new App({
  token: process.env.SLACK_OAUTH_TOKEN,
  signingSecret: process.env.SLACK_SIGNING_SECRET
});


exports.handler = async (event) => {
  const slackId = await getSlackUser('example_real_name').id;
  console.log(slackId);
  await sendSlackMessage(slackId, 'Bot message');
}


sendSlackMessage = async (channel, message) => {
  await web.chat.postMessage({
    channel: channel,
    text: message,
    as_user: true
  });
}

getSlackUser = async(real_name) => {
  const result = await app.client.users.list({
    token: process.env.SLACK_OAUTH_TOKEN
  });
  console.log(result);
  return result.members.find((user) => user.real_name == real_name);
}
  

Комментарии:

1. Дает ли console.log (результат), отображающий список пользователей, что-то? и если да, есть ли в этом массиве элементов реальное имя, совпадающее с вводимым real_name?

2. да, он выдает ответ, подобный показанному здесь: api.slack.com/methods/users.list

Ответ №1:

Проблема заключается в приоритете в этой строке:

 const slackId = await getSlackUser('example_real_name').id;
  

Поскольку доступ участника имеет более высокий приоритет (оцененный ранее), чем await, он фактически такой же, как:

 const slackId = await (getSlackUser('example_real_name').id);
  

getSlackUser возвращает объект Promise, тогда его id член не определен. Await ожидает неопределенного, то есть undefined .

Чтобы исправить это, убедитесь, что ожидание оценивается перед .id :

 const slackId = (await getSlackUser('example_real_name')).id;