20210113のNode.jsに関する記事は4件です。

APIを叩いていてTimestamp for this request is too fast.とエラーが出た時の解決策

APIを叩いていたらこんな応答が返ってきました

なぜ・・日本時間なのが悪いのか?と色々推測しました。

{
  "status": 1,
  "messages": [
    {
      "message_code": "ERR-5009",
      "message_string": "Timestamp for this request is too fast."
    }
  ],
  "responsetime": "2021-01-13T07:43:02.225Z"
}

結論 PCの時刻設定が違っている

特に設定をいじった覚えはないのですが、確かにずれがありました。
下記画像では、既に時間の修正を行っています。直す前は7.5秒のずれがありました。
スクリーンショット 2021-01-13 16.59.52.png
https://www.time-j.net/worldtime/country/jp

上記サイトと見比べながら人力で修正

時計の時間の部分をぽちぽちやります。
スクリーンショット 2021-01-13 17.02.09.png

ちゃんとデータが返ってくるようになりました

{
  "status": 0,
  "data": [
    {
      "amount": "4133",
      "available": "4133",
      "conversionRate": "1",
      "symbol": "JPY"
    },
  ],
  "responsetime": "2021-01-13T07:51:49.678Z"
}
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

yarnしたら The engine "node" is incompatible with this module.

環境

$ yarn --version
1.22.10
$ node --version
v14.15.1

困りごと

久しぶりにプロジェクトを立ち上げようとしましたが、、、yarnができない:frowning2:

$ yarn
yarn install v1.22.10
[1/5] ?  Validating package.json...
error furien-web@1.0.0: The engine "node" is incompatible with this module. Expected version "12.10.0". Got "14.15.1"
error Found incompatible module.
info Visit https://yarnpkg.com/en/docs/cli/install for documentation about this command.

原因

localPCの環境と現場で使われているnodeのversionがずれている?
(そういえばつい最近ゴニョゴニョやってた時にlocalのversion上げてたかもと気がつく。)

解決策

node versionを12.10.0に変更します(現場の方に合わせます)。

nodebrew use 12.10.0

nodeのversionが切り替わりました。

$ node --version
v12.10.0

一時的にversionを無視して進めたい方はこちら。あくまでも一時的な対処法であります。:boy_tone1:

$ yarn --ignore-engines

結果

無事通りました:relaxed:
環境の違いにもっと早く気がつけていれば。。
現場からは以上です。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Node.js × LINE WORKS API】監査ログをダウンロードする

すんごいドマイナーな内容なのですが、やりたいことのために必要だったので調べました。( ゚Д゚)

ただ、勉強不足なせいか思ったより時間がかかってしまいました。。。
反省と自身の備忘録的にしっかりとアウトプットしておこうと思います(=_=)

LINE WORKS API

LINE WORKS で提供されている API です。
トーク Bot を操作したり、カレンダーやメールの内容を取ってきたりできます。
今回使用するのは 監査データのダウンロード API です。

LINE WORKS Developers

実行環境

実行環境は以下の通りです。

  • Node.js
  • Visual Studio Code
  • LINE WORKS API

事前準備

  1. Node.js をインストール
  2. Visual Studio Code をインストール
  3. LINE WORKS Developer Console で認証情報を取得
  4. 各モジュールをインストール
npm install request --save
npm install csv --save

API を Request するコード

download.js
// LINEWORKS 認証情報
const CONSTS = require("./consts.js");

const request = require('request');
const csv = require('csv');

const apiId = CONSTS.API_ID;
const feature = 'log';
const service = 'message';
const serviceId = 'audit';
const endDate = getUnixTime();
const startDate = Number(endDate) - 86400; // 24時間前から現在時刻までのログを取得
const tenantId = CONSTS.DOMAIN_ID;
const domainId = CONSTS.DOMAIN_ID;
const rangeName = 'tenant';
const uri = `https://audit.worksmobile.com/r/${apiId}/audit/v2/${feature}/${service}/logs.csv?apiId=downCsvLog&serviceId=${serviceId}&startDate=${startDate}&endDate=${endDate}&tenantId=${tenantId}&domainId=${domainId}&rangeName=${rangeName}`;

const options = {
  'method': 'GET',
  'url': uri,
  'headers': {
    'consumerKey': CONSTS.CONSUMER_KEY,
    'Authorization': `Bearer ${CONSTS.TOKEN}`
  }
};
request(options, function (error, response) {
    if (error) throw new Error(error);
    csv.parse(response.body,
        { bom: true, columns: true },
        (err, data) => { console.log(data) }
    )
});

function getUnixTime() {
  const date = new Date();
  const now = date.getTime();
  return Math.floor(now/1000);
};

コードについて補足

  • 認証情報は CONSTS.js ファイルにまとめてあります。
CONSTS.js
const DOMAIN_ID = 'xxxxxxxxxxxx';
const API_ID = 'xxxxxxxxxxx';
const CONSUMER_KEY = 'xxxxxxxxxxx';
const TOKEN = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'

exports.DOMAIN_ID = DOMAIN_ID;
exports.API_ID = API_ID;
exports.CONSUMER_KEY = CONSUMER_KEY;
exports.TOKEN = TOKEN;
  • 今回はトークログを取得しているので const service = 'message'; を指定しています。ログイン状況やメールなどのログも取得できます。詳しくは公式ドキュメントを参照ください。

  • トークログのみ unix timestamp 形式で時間単位の指定が可能なので unix timestamp 形式で指定しています。

  • UNIX time stamp 形式で指定する場合 24時間以内のデータしか取得できません。

  • Request URL、ちょー長いですよね!( ゚Д゚)メンドイ

  • 取得した CSV データには BOM が入っているので csv.parse するときにオプションを指定しています。{ bom: true, columns: true }

おわりに

ここまでお付き合いいただきありがとうございました。

冒頭にも書きましたが、やりたいことがあって・・・
Bot の入っていないトークルームの発言をトリガーにしたいんですよね。
本当は GAS で実装したかったのですが GAS での csv ダウンロードがどうにもうまくできなくて。
GAS は Node.js での実装が終わったら再チャレンジしようと思います。

ではまた!(^^)/

参考にさせていただきましたm(_ _)m

LINE WORKS Developers
Visual Studio Codeをインストールする

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

JavaScriptでPythonのenumerate関数を実行するには

はじめに

Node.jsを使ったWebアプリの開発にて、forEachでリストを回していたのですが、
急遽インデックスの情報も必要になりました。

そこで次のようなソースコードを書いたものの、「もっといい方法がある」と仲間に指摘されました。
実際に試したところ非常に便利だったことと、Pythonのenumerate関数に近いものを感じたので、
for文でインデックスとバリューを同時に取得する方法として、記事に残します。

ary = ["bar", "foo", "hoge"]

let i = 0 
ary.forEach(function( value ) {
     console.log(i, value );
     i++
});
// 0 bar
// 1 foo
// 2 hoge

実行環境

  • Node.js v12.16.3

検証環境

  • Paiza.io(Python 3.8.2)
  • Paiza.io(Node.js v12.18.3)

そもそもenumerate関数とは

引数に指定したリストの、インデックスとバリューを取得する関数です。

ary = ["bar", "foo", "hoge"]
for i, item in enumerate(ary):
    print(i, item)
#  0 bar
#  1 foo
#  2 hoge

for文でインデックスとバリューを同時に取得する

forEachは、第二引数にインデックスを指定できる

forEach関数において 第一引数はリスト、第二引数はインデックスを取ります。

このインデックスは、ループ回数が増加するごとに自動的にインクリメントされるため、
i++i += 1と記述する必要はありません。

ary = ["bar", "foo", "hoge"]
ary.forEach(function(value, i) {
     console.log(i, value);
});
// 0 bar
// 1 foo
// 2 hoge

for inを使う

for inはリストのインデックスを取得します。
次のようなソースコードにより、インデックスとバリューを取り出します。

ary = ["bar", "foo", "hoge"]

for (i in ary){
    console.log(i, ary[i])
}
// 0 bar
// 1 foo
// 2 hoge

一方で、for inでは次のように予期しない挙動を示す場合もあるので、
利用には注意が必要そうです。

var data = [ 'apple', 'orange', 'banana'];
//配列オブジェクトにhogeメソッドを追加
Array.prototype.hoge = function(){}
  for (var key in data){
   console.log(data[key]);
  }
// apple
// orange
// banana
// function(){}

参考

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む