【问题标题】:slack bot sending direct message to user using aws lambda functionslack bot 使用 aws lambda 函数向用户发送直接消息
【发布时间】:2021-01-07 20:52:39
【问题描述】:

我正在尝试使用 slack web api 向用户发送直接消息,但我认为当我调用 slackId 时,gets all the available users 的 getSlackUser 方法没有及时完成;

console.log(slackId) 给出未定义的意思,它没有用bolt 完成我的 api 调用

如何确保 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);
}

【问题讨论】:

  • console.log(result) 显示用户列表是否提供了什么?如果是的话,这个成员数组是否有一个真实的名字来计算输入 real_name ?
  • 是的,它会产生如下所示的响应:api.slack.com/methods/users.list

标签: javascript asynchronous aws-lambda async-await slack-api


【解决方案1】:

问题是这一行的优先级:

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

由于成员访问具有比等待更高的优先级(之前计算),因此它实际上与:

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

getSlackUser 返回一个 Promise 对象,那么它的 id 成员是未定义的。 await 等待未定义的,即undefined

要解决此问题,请确保在 .id 之前评估 await:

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

【讨论】:

    猜你喜欢
    • 2022-12-07
    • 2017-08-13
    • 1970-01-01
    • 1970-01-01
    • 2017-02-27
    • 2017-05-16
    • 2021-08-08
    • 1970-01-01
    • 2019-04-18
    相关资源
    最近更新 更多