REST APIのPUTやPOSTを「保存実行前イベント」や「保存成功後イベント」で行うとエラーになる

お世話になります。渡邊です。

アプリAの保存時に、アプリBを登録・更新するような、下記のようなコードを書いてますが、エラーの方に分岐していってしまいます。

kintone.Promiseオブジェクトも試してみましたが、やはり同じようにエラーの方に分岐してしまいます。

「文字列__1行_」の変更イベントの時は、特にエラーの方に分岐していきません。

仕様なのでしょうか?それとも何か勘違いしてるのでしょうか?

(function () {
    "use strict";
    
    var appID_test = 15;
    
    // 保存実行後
    //kintone.events.on(["app.record.edit.change.文字列 __1行_","app.record.create.change.文字列__ 1行_"], function(event) {
    //kintone.events.on(["app.record.edit.submit", "app.record.create.submit"], function(event) {                   // 保存実行前
    kintone.events.on(["app.record.create.submit.success","app.record.edit.submit.success"], function(event) {     // 保存実行後
    
    
          // レコードへの値の設定
        var record = event.record;

        var flgGeppo = 0;

        if(flgGeppo == 0){
        
             // リクエストプロパティ(JSON)
            var params = {
                "app": appID_test,
                "record": {
                    "数値": { "value": 1   },
                    "計算": { "value": ""}
                
                }
            };
            
            console.log(params);

            // kintone REST API リクエスト ~ レコードの登録(POST)
            kintone.api(
                kintone.api.url('/k/v1/record', true), // - pathOrUrl
                'POST',                                // - method
                params,                                // - params
                function(resp) {                       // - callback
                    // (特に何もしない)
                    console.log(params);
                },
                function(resp) {                       // - errback
                    var errmsg = 'エラーが発生しました。 登録時';
                    // (特に何もしない)
                    if (resp.message !== undefined){
                      errmsg += '' + resp.message;
                    }
                    console.log(errmsg);
                    console.log(resp);
                    console.log(params);
                    alert(errmsg);
                    alert(params);
                    alert(resp);
                }
            );
            
        }else{
             // リクエストプロパティ(JSON)
            var params = {
                "app": appID_test,
                "id": 7,
                "record": {
                    "数値": { "value": 2   },
                    "計算": { "value": ""}
                }
            };
            
            console.log(params);

            // kintone REST API リクエスト ~ レコードの更新(PUT)
            kintone.api(
                kintone.api.url('/k/v1/record', true), // - pathOrUrl
                'PUT',                                // - method
                params,                                // - params
                function(resp) {                       // - callback
                    // (特に何もしない)
                    console.log(params);
                },
                function(resp) {                       // - errback
                    var errmsg = 'エラーが発生しました。 更新';
                    // (特に何もしない)
                    if (resp.message !== undefined){
                      errmsg += '' + resp.message;
                    }
                    console.log(errmsg);  
                    console.log(resp);
                    console.log(params);
                    alert(errmsg);
                    alert(params);
                    alert(resp);
                }
            );
        }
        return event;
    });

})();

リクエストに「計算」フィールドが入っているのが気になります。

計算フィールドはユーザが値を設定することができないのでAPIでもエラーとなります。

一度計算フィ-ルドを削除して試してみていただけますか。

            var params = {
                "app": appID_test,
                "id": 7,
                "record": {
                    "数値": { "value": 2}
                }
            };

あとは、submit.successイベントはちょっとクセがあるようで、体験されているかと思いますが直後にリロード走ったりするので、kintone.api() をPromiseなしの非同期処理のまま括るのは意図通りの動きにならない可能性を高めそうです。(createとeditでも少し違う動きに見えたり・・・よく確認できてない麺がありますが)

一方 submit.successイベントも従来のsubmitイベントと同じようにkintone.Promiseをreturn出来るようですので、非同期処理は return new kintone.Promise で括って、最終的にreturn eventするのが良さそうです。

カキ氷さま

 

ご回答ありがとうございます!

paramsの計算フィールドを削除しましたが、

エラーとなります。

アプリBは計算フィールドを持っていたいのですが、

その場合は、paramsはどういう記述方法になるのでしょうか?

Ryu Yamashita

いつもご回答ありがとうございます。

 癖ががあるsubmit.successイベントではない場合でも、app.record.edit.submitであれば、エラーは発生しませんが、app.record.create.submitでエラーが発生してしまいました。

Promiseでの処理が書けてなかったかもしれませんので、Promiseで再度試してみます。

Ryu Yamashita様

先ほどのコードの「kintone REST API リクエスト ~ レコードの登録(POST)」の部分に下記のコードを書いてるのですが、

エラーとなってしまいます。書き方が異なるのでしょうか?

            var testValue = 1;
            var query = '数値="' + testValue + '"';
            return new kintone.Promise(function(resolve, reject) {
                var params = {app: appID_test, query: query};
                kintone.api('/k/v1/record', 'POST', params, function(resp) {
                    resolve(resp);
                });
            }).then(function(resp) {
                    var errmsg = 'エラーが発生しました。 登録時';
                    // (特に何もしない)
                    if (resp.message !== undefined){
                      errmsg += '' + resp.message;
                    }
                    console.log(errmsg);
                    console.log(resp);
                    console.log(params);
                    alert(errmsg);
                    alert(params);
                    alert(resp);
                
                
                return event;
            });

渡邊 さん

最初のコードをpromise化してみました。

エラーが出た場合、分かる範囲でいいのでその内容も教えていただけると解決の糸口が見つかるかもしれませんのでお願いします。

 

(function () {
    "use strict";

    var appID_test = 15;

    // 保存実行後
    //kintone.events.on(["app.record.edit.change.文字列 __1行_","app.record.create.change.文字列__ 1行_"], function(event) {
    //kintone.events.on(["app.record.edit.submit", "app.record.create.submit"], function(event) {                   // 保存実行前
    kintone.events.on(["app.record.create.submit.success","app.record.edit.submit.success"], function(event) {     // 保存実行後


          // レコードへの値の設定
        var record = event.record;

        var flgGeppo = 0;

        if(flgGeppo == 0){

             // リクエストプロパティ(JSON)
            var params = {
                "app": appID_test,
                "record": {
                    "数値": {"value": 1}
                }
            };

            console.log(params);

            // kintone REST API リクエスト ~ レコードの登録(POST)
            return kintone.api(
                kintone.api.url('/k/v1/record', true), // - pathOrUrl
                'POST',                                // - method
                params                                // - params
            ).then(function(resp) {// - callback
                // (特に何もしない)
                console.log(params);
                return event;
            }).catch(function(resp){
                var errmsg = 'エラーが発生しました。 登録時';
                // (特に何もしない)
                if (resp.message !== undefined){
                  errmsg += '' + resp.message;
                }
                console.log(errmsg);
                console.log(resp);
                console.log(params);
                alert(errmsg);
                alert(params);
                alert(resp);
            });

        }else{
            // リクエストプロパティ(JSON)
            var params = {
                "app": appID_test,
                "id": 7,
                "record": {
                    "数値": {"value": 2}
                }
            };

            console.log(params);

            // kintone REST API リクエスト ~ レコードの更新(PUT)
            return kintone.api(
                kintone.api.url('/k/v1/record', true), // - pathOrUrl
                'PUT',                                // - method
                params                                // - params
            ).then(function(resp) {// - callback
                // (特に何もしない)
                console.log(params);
                return event;
            }).catch(function(resp) {// - errback
                var errmsg = 'エラーが発生しました。 更新';
                // (特に何もしない)
                if (resp.message !== undefined){
                  errmsg += '' + resp.message;
                }
                console.log(errmsg);
                console.log(resp);
                console.log(params);
                alert(errmsg);
                alert(params);
                alert(resp);
            });
        }
    });
})();

カキ氷さま

 

ありがとうございます!

全くエラーが発生しません。

こちらを利用させていただきます!

渡邊さんのコードとカキ氷が書かれたコードは多分等価で、良さ気に見えるので、エラーの内容次第でしょうか。

 

また、極力エラーは拾うようにした方がいいですね。

すみません。等価ではなさそうですね。やはり、エラーの取扱部分は少なくとも。

 

> 全くエラーが発生しません。

> こちらを利用させていただきます!

 

ということは、どこかに違いがありそうですが、・・・ひとまず解決されたようで良かったですね。

Ryu Yamashita様

 

ちょっと、まだコードの差分を確認できてないのですが、等価でしたか。。。

このsubmitのエラーの場合、「resp」の中はconsole.logで出しても空でしたので。。。

 

あ、よかった。はい、追って、差分を確認しようと思います。

ありがとうございました。

return new kintone.Promise(function(resolve, reject) {
                var params = {app: appID_test, query: query};
                kintone.api('/k/v1/record', 'POST', params, function(resp) {
                    resolve(resp);
                }, function(err){
reject(err)
});
            })

 

> このsubmitのエラーの場合、「resp」の中はconsole.logで出しても空でしたので。。。

やはりエラーが拾えてないためです。

 

上のコードのように、エラーを拾い分ける必要があります。kintone.api() は、エラーバック省略できますが、書いたほうが良いと思います。文字通りエラーが拾えませんので。また、Promiseをチェーンした場合にcatchも書くのが良いと思います。rejectされた内容の処理が拾えませんので。

Ryu Yamashita様

たびたび、ありがとうございます。

respとerrでかき分けたいと思います。

rejectでの記述やcatchなども了解しました。

いろいろありがとうございました。