0

Alfresco のレポ側に Webscript をセットアップしました。Web スクリプトは POST メソッドを使用し、json を受け入れて返し、クライアント側の ajax アプリをサポートするためにいくつかのプロパティを設定するように単純に設計されています。スクリプトのコントローラー コードは次のとおりです。

/**
 * Document Bundle Management Property setter method
 *
 * @method POST
 */

function main() {
        var nodeRef=args.doc,
            salesOrderNumber=json.get("salesOrderNumber"),
            stockCode=json.get("stockCode"),
            VIN=json.get("VIN"),
            customerCode=json.get("customerCode"),
            resultObj={result:"failure",problems:[],debug:[]};
        resultObj.debug.push("Webscript begins. Variables:");
        resultObj.debug.push("\tsalesOrderNumber: " + salesOrderNumber);
        resultObj.debug.push("\tstockCode: " + stockCode);
        resultObj.debug.push("\tVIN: " + VIN);
        resultObj.debug.push("\tcustomerCode:" + customerCode);
        if (nodeRef) {
                resultObj.debug.push("Received nodeRef variable. Checking validity");
                doc=utils.getNodeFromString(nodeRef);
                if (doc && doc.isDocument) {
                        resultObj.result="success";
                        resultObj.debug.push("nodeRef valid, checking document type");
                        if (doc.isSubType("my:documentBundle")) {
                                resultObj.debug.push("Document is already of type my:documentBundle. Not specializing");
                        } else {
                                resultObj.debug.push("Document is not of type my:documentBundle. Specializing");
                                doc.specializeType("my:documentBundle");
                        }
                        if (salesOrderNumber && salesOrderNumber.length && salesOrderNumber.length>0) {
                                doc.properties["salesOrderNumber"]=salesOrderNumber;
                                resultObj.debug.push("Set document salesOrderNumber to " + salesOrderNumber);
                        } else {
                                resultObj.debug.push("salesOrderNumber was not received, was blank or of zero length. ignoring");
                        }
                        if (stockCode && stockCode.length && stockCode.length>0) {
                                doc.properties["stockCode"]=stockCode;
                                resultObj.debug.push("Set document stockCode to " + stockCode);
                        } else {
                                resultObj.debug.push("stockCode was not received, was blank or of zero length. ignoring");
                        }
                        if (VIN && VIN.length && VIN.length>0) {
                                doc.properties["VIN"]=VIN;
                                resultObj.debug.push("Set document VIN to " + VIN);
                        } else {
                                resultObj.debug.push("VIN was not received, was blank or of zero length. ignoring");
                        }
                        if (customerCode && customerCode.length && customerCode.length>0) {
                                doc.properties["customerCode"]=customerCode;
                                resultObj.debug.push("Set document customerCode to " + customerCode);
                        } else {
                                resultObj.debug.push("customerCode was not received, was blank or of zero length. ignoring");
                        }
                        doc.save();
                        resultObj.debug.push("document saved");
                } else {
                        resultObj.problems.push("Invalid nodeRef supplied!");
                }
        } else {
                resultObj.problems.push("No nodeRef supplied!");
        }
        model.obj=resultObj;
}

main();

私の問題は、次のような 4 行で発生します:if (salesOrderNumber && salesOrderNumber.length && salesOrderNumber.length>0) {は、変数に長さがゼロではない文字列が含まれていることが確実な場合でも、常に false と評価されるようです。返されたデバッグ プロパティを見ると、次のように表示されます。

0: "Webscript begins. Variables:"
1: "    salesOrderNumber: test"
2: "    stockCode: test"
3: "    VIN: test"
4: "    customerCode:test"
5: "Received nodeRef variable. Checking validity"
6: "nodeRef valid, checking document type"
7: "Document is already of type my:documentBundle. Not specializing"
8: "salesOrderNumber was not received, was blank or of zero length. ignoring"
9: "stockCode was not received, was blank or of zero length. ignoring"
10: "VIN was not received, was blank or of zero length. ignoring"
11: "customerCode was not received, was blank or of zero length. ignoring"  
12: "document saved"

したがって、4 つの変数すべての値が「test」であることがわかります。firebug または js コンソールで入力した場合

a="test";
if (a && a.length && a.length>0) then console.log("true") else console.log("false")

期待どおり、真の出力が得られます。何がこれに影響を与えているのかわかりません。この非常に基本的な条件をほぼ毎日使用して、文字列を使用する前にテストしていますが、今回は明らかに何かが欠けています。ヘルプ?

4

1 に答える 1

1

編集:以下のあなたのコメントに基づいて、私は新しい理論を持っています. これらは何らかのオブジェクトであり、プリミティブ文字列ではないように見えるため、lengthメソッドが問題の原因となっています。

この単純なテストは、問題とまったく同じように動作します。

var x = {
    toString: function() { return 'test'; },
    length: function() { return 'something'; }
};

console.log('x is: ' + x);
if (x && x.length && x.length > 0)
    console.log('passed');
else
    console.log('failed');

文字列に連結すると「テスト」と報告されますが、長さが関数であるためlength > 0、が偽であるため、テストに失敗します。文字列に変換することをお勧めします。


また、あなたのテストのいくつかは不必要であることを指摘します。が falseysalesOrderNumber.length > 0である場合にのみ false になります。salesOrderNumber.length同様に、が空の文字列 (文字列の場合) であるsalesOrderNumber.length場合にのみ falsey になるため、次のように簡単に実行できます。salesOrderNumber

salesOrderNumber = String(salesOrderNumber);
if (salesOrderNumber)
    console.log('ok');
else
    console.log('oops');
于 2012-11-12T05:19:15.980 に答える