Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

はじめに

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経由のデータ転送は、このライブラリ使った方が断然便利なので、
僕は絶対こっち使うようにしてます。

ではまた〜。

the_red
富山県の田舎の方でリモートワークしてるプログラマー 。 kintoneカスタマイズ用のOSSフレームワーク「Goqoo on kintone」シリーズを開発しています。 https://github.com/goqoo-on-kintone
https://note.com/the_red
sonicgarden
「お客様に無駄遣いをさせない受託開発」と「習慣を変えるソフトウェアのサービス」に取り組んでいるソフトウェア企業
http://www.sonicgarden.jp
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした