はじめに
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 */ })
ドヤァ。
これによって、同一ドメイン内に「本番環境」「ステージング環境」をそれぞれ用意して、スムーズに運用することが可能になりました
ちょっとネストが深いですが、一回定義してしまえば後はスムーズに動きます。そしてこの方法なら、スペース未所属のアプリを便宜上グループ化したい場合でも問題なく動きます
環境は3つでも4つでも好きに作ることができますので、みなさん是非お試しくださいね〜。
サイボウズさんへ
スペースIDが簡単に取れればもっと色々スムーズなので、
JavaScript APIに kintone.app.getSpaceId()
みたいな関数が欲しいです!
ぜひ機能追加お願いします!
そうそう、kintoneに機能追加してほしい要望などある場合、管理画面の「お問い合わせ -> ご意見・ご要望」から投稿すると、けっこう真剣に検討してもらえるみたいですよ!
僕もさっきこちらから要望出しときましたw
https://jp.cybozu.help/ja/general/admin/support.html
皆さんも何かあればどんどん要望しちゃいましょう〜。
補足
ちなみにkintoneUtilityってのはこれです。
https://developer.cybozu.io/hc/ja/articles/115000333223
API経由のデータ転送は、このライブラリ使った方が断然便利なので、
僕は絶対こっち使うようにしてます。
ではまた〜。