Node.jsからChatworkのタスクを追加するメモその2


前回記事の続きです。

タスク追加にあたり、メンバーのリストを取得してきてから追加します。

APIドキュメントはこちらです。

[JavaScript] 非同期処理のコールバック地獄から抜け出す方法を参考にasync/awaitのaaを使って同期的に処理を書いてみます。

$ npm i aa request
chtask.js
'use strict';

if (!process.env.chtoken) {
    console.log('Error: Specify token in environment');
    process.exit(1);
}

let aa = require('aa');
let request = require('request');
const ROOM_ID = '43484166';

//タスク追加
function addTask(text, userList){
  let task = {
    body: text,
    limit: 0,
    to_ids: userList,
  };

  let options = {
      url: `https://api.chatwork.com/v1/rooms/${ROOM_ID}/tasks`,
      headers: {
          'X-ChatWorkToken': process.env.chtoken
      },
      form: task,
      json: true
  };

  return new Promise((resolve,reject) => {
    request.post(options, (error, response, body) => {
      if(error) reject('error: '+ response.statusCode);
      resolve(body);
    });
  });

}

//メンバー取得
function getMember(){
  let options = {
      url: `https://api.chatwork.com/v1/rooms/${ROOM_ID}/members`,
      headers: {
          'X-ChatWorkToken': process.env.chtoken
      },
      json: true
  };

  return new Promise((resolve,reject) => {
    request.get(options, (error, response, users) => {
      if(error) reject('error: '+ response.statusCode);
      let userList = '';
      for (let i = 0, len = users.length; i < len; i++) {
        userList += users[i].account_id;
        if(len !== i+1) userList += ',';
      }
      resolve(userList);
    });
  });
}

//同期実行
aa(function*() {
  let userList = yield getMember();
  let res = yield addTask('message', userList);
  return res;
}).then(
  function (val) { console.info('ok: ',val); },
  function (err) { console.error('ng: ',err); }
);

実行してみます。

$ chtoken=xxxxxxxxx node chtask.js

こんな感じでタスク追加できました。

APIを二回投げるあたりは非同期処理の練習になりますね〜