LoginSignup
12
7

More than 3 years have passed since last update.

kintoneの本番環境・開発環境で異なるアプリIDを自動判定する方法

Last updated at Posted at 2018-01-05

はじめに

kintoneのJSカスタマイズで複数アプリを連携して何かする場合、
アプリIDをソースコード内に書かなければいけない場合があります。
例えばこんな風にやってる人は多いでしょう。

const app = {
  customer: 10,
  order: 11,
}

kintoneUtility.rest.postRecords({
  app: app.customer,
  records: [ /* something */ ],
})
.then(resp => { /* do something */ })

複数環境に対応したい

ここで問題になるのが、開発環境・本番環境をドメイン・スペースなど複数使って分けている場合、それぞれの環境ごとにアプリIDが違うということです。

本番リリース時にappオブジェクト内の全IDを書き直して、次の開発時にまた開発用アプリIDに戻して…
みたいなことをするのが非常に手間だったので、
自動判定するようにしてみました。

別ドメインのアプリIDを自動判定

ドメイン名をキーにしたオブジェクトを作って、

const App = {
  '<開発ドメイン>.cybozu.com': {
    customer: 10,
    order: 11,
  },
  '<本番ドメイン>.cybozu.com': {
    customer: 127,
    order: 128,
  }
}

const domain = location.hostname
const app = App[domain]

kintoneUtility.rest.postRecords({
  app: app.customer,
  records: [ /* something */ ],
})
.then(resp => { /* do something */ })

どうですか??シンプルでとても使いやすくないですか??
最初はwebpackの開発・本番の各設定ファイル内に分けて定義しようとしたんですが、
それだと再ビルドの手間もかかっちゃうので、普通にこっちの方が便利という結論になりました。
よかったら活用してみてください〜。

同一ドメイン別環境のアプリIDを自動判定

スペースIDでの判定

本当は、同じドメインの中でもスペースで環境分けた場合に、
スペースIDもキーに含めてこんな風に書きたいんです。

const app = App[domain][space]

でもスペースIDはREST APIのapp.json使わないと取れないので、
非同期処理でその辺をやるのがとても面倒だったのでやめました。

スペースIDを使わない判定(2018-09-13追記)

2018年1月の投稿時点では諦めてたんですけどね、
そのあと7月にね、思いついたんですようまいやり方!
(Qiita書くのが9月にもつれ込んでしまって申し訳ない・・・)

スペースIDは不要で、「現在のアプリID」をうまく使ってやれば良いのです!

const environments = {
  '<開発ドメイン>.cybozu.com': [
    {
      // 開発環境
      customer: 10,
      order: 11,
    },
  ],
  '<本番ドメイン>.cybozu.com': [
    {
      // 本番環境
      customer: 127,
      order: 128,
    },
    {
      // ステージング環境
      customer: 129,
      order: 200,
    },
  ],
}

// まず現在のドメイン名で絞る
const spaces = environments[location.hostname]
// 次に現在のアプリIDを含む環境を1つ抽出
const app = spaces.find(s => Object.values(s).some(appId => appId === kintone.app.getId()))

// 以降の使い方は同じ!
kintoneUtility.rest.postRecords({
  app: app.customer,
  records: [ /* something */ ],
})
.then(resp => { /* do something */ })

ドヤァ。
これによって、同一ドメイン内に「本番環境」「ステージング環境」をそれぞれ用意して、スムーズに運用することが可能になりました :sunglasses:

ちょっとネストが深いですが、一回定義してしまえば後はスムーズに動きます。そしてこの方法なら、スペース未所属のアプリを便宜上グループ化したい場合でも問題なく動きます :thumbsup:

環境は3つでも4つでも好きに作ることができますので、みなさん是非お試しくださいね〜。

サイボウズさんへ

スペースIDが簡単に取れればもっと色々スムーズなので、
JavaScript APIに kintone.app.getSpaceId() みたいな関数が欲しいです!
ぜひ機能追加お願いします!

そうそう、kintoneに機能追加してほしい要望などある場合、管理画面の「お問い合わせ -> ご意見・ご要望」から投稿すると、けっこう真剣に検討してもらえるみたいですよ!
僕もさっきこちらから要望出しときましたw

https://jp.cybozu.help/ja/general/admin/support.html
スクリーンショット 2018-01-05 13.46.14.png

皆さんも何かあればどんどん要望しちゃいましょう〜。

補足

ちなみにkintoneUtilityってのはこれです。
https://developer.cybozu.io/hc/ja/articles/115000333223
API経由のデータ転送は、このライブラリ使った方が断然便利なので、
僕は絶対こっち使うようにしてます。

ではまた〜。

12
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
7