2016-05-09 24 views
0

問題: Node.jsからリクエストを送信してデータソースを作成するColdFusion RESTサービスを作成できません。 Node.jsからColdFusionのレストサービスにデータをポストしようとするたびに、引数の値が空になります。node.jsからcoldfusion restサービスへのデータの投稿

コードIが変数htOptionsheadersオプションを含むしようとすると、私は次のエラーを取得する

<cfcomponent rest="true" restPath="/dsnComponent"> 

    <cffunction name="createDataSource" access="remote" 
        returnType="any" httpMethod="POST" restpath="{strDSN}" produces="application/JSON"> 

     <cfargument name="strDSN" default="" type="any" restargsource="form"> 
     <cfdump var = #strDSN# format="html" output="D:\api.html"> 
      <cfset reqDSN = deserializeJSON(strDSN)> 
      <cfset structDSN = structNew() > 
      <cfset structDSN.driver = "MSSQLServer" > 
      <cfset structDSN.name = reqDSN.name > 
      <cfset structDSN.host = "localhost" > 
      <cfset structDSN.port = "1433" > 
      <cfset structDSN.database = reqDSN.name> 
      <cfset structDSN.username = "sa" > 
      <cfset structDSN.password = "*****" > 
     <cfscript> 

      adminObj = createObject("component","cfide.adminapi.administrator"); 
      adminObj = adminObj.login('***','admin'); 
      myObj = createObject("component","cfide.adminapi.datasource"); 
      myObj.setMSSQL(argumentCollection = structDSN); 
      structDSN.success = myObj.verifyDSN(dsn = structDSN.name, returnMsgOnError = 'true'); 

     </cfscript> 

     <cfset res = serializeJSON(structDSN) /> 
     <cfreturn structDSN> 
    </cffunction> 

</cfcomponent> 

ColdFusionのRESTサービスのためにコードのNode.jsから

var http = require('http'), 
    postData = { 
     name: "ab" 
    }, 
    postData = JSON.stringify(postData), 
    htOptions = { 
     hostname: 'localhost', 
     port: 8500, 
     path: "/rest/createdsn/dsnComponent/createDataSource", 
     method: "POST", 
     headers: { 
      'Content-Type': 'application/x-www-form-urlencoded', 
      'Content-Length': Buffer.byteLength(postdata) 
     } 
    } 

var req = http.request(htOptions); 
console.log(postData)  // {"name":"ab"} 
    req.write(postData); 
    req.end(); 
    req.on('response', (res) => { 
     console.log(`STATUS: ${res.statusCode}`); 
     console.log(`HEADERS: ${JSON.stringify(res.headers)}`); 
     res.setEncoding('utf8'); 
     res.on('data', (chunk) => { 
     console.log(`BODY: ${chunk}`); 
     }); 
     res.on('end',() => { 
     console.log('No more data in response.') 
     }) 
     console.log('api successfully called'); 
    }); 

をデータを投稿するため

enter image description here

私はヘッダが含まれていない場合、私はRESTサービスを呼び出すためにCFMページを作成し、それが成功したデータ・ソースを作成した私の引数に空の文字列を取得し、エラー

{"Message":"JSON parsing failure: Unexpected end of JSON string"}

を受け取りますColdFusion Administratorで

コード

<cfset structDSN.name = "ab"> 
<cfset strDSN = serializeJSON(structDSN)> 

<cfhttp url="http://localhost:8500/rest/createdsn/dsnComponent/createDataSource" method="post" port="8500" result="res"> 
    <cfhttpparam name="strDSN" value="#strDSN#" type="formfield" /> 
</cfhttp> 

私は何が間違っているのか分かりません。

+0

node.jsコードのどの行が引数を提供するはずですか? –

+0

あなたのCF投稿の例にはヘッダーの権利が含まれていませんか? –

+0

あなたが500のエラーを受け取ったら、api.htmlに何かが表示されますか? –

答えて

2

は、Node.jsのではあなたが'Content-Type': 'application/x-www-form-urlencoded'ヘッダーを使用しているが、あなたが適切にコンテンツタイプのデータを符号化していません。

また、要求のフォームからstrDSN引数が出てくると思っていますが、それはどこにも定義されていません(私が間違っていない限り、CFはあまり分かりません)。 フォームデータを取得するときに、要求本体文字列に;が区切られたargument=valueのペアが含まれているため、strDNS=URLEncodedDataのようになります。だから、

、あなたがstrDSN=%7B%22name%22%3A+%22ab%22%7D(すべて{}:"、および(space)はURLエンコードされている) はhttps://nodejs.org/dist/latest-v6.x/docs/api/querystring.html#querystring_querystring_stringify_obj_sep_eq_options

を参照するか、またはあなたが"Content-Type": "application/json"を使用し得られます

postData = { 
    name: "ab" 
}; 
postData = querystring.stringify({strDSN: JSON.stringify(postData)}); //urlencode strDSN argument as JSON string 
req.write(postData); // or req.end(postData) 

を行うと、いずれか

postData = JSON.stringify(postData); 
req.write(postData); // or req.end(postData); 

となり、おそらくdeserializeJSON()にあなたのCFの要求本文/コンテンツが必要になります。

+0

'" Content-Type ":" application/json "'を使うと、ファイルにダンプされた引数の値を取得できませんでした。しかし、あなたの最初の提案は私の問題解決に役立ちます。ありがとう –

0

私はこれがあなたの問題であるかどうかわかりませんが、あなたの関数CreateDataSource()に構文エラーがあります。

はあなたのリターンVARは、このように設定されて:あなたはCF、構造体ではなく、あなたの「RES」変数を返している

<cfset res = serializeJSON(structDSN) /> 
     <cfreturn structDSN> 

。それはあなたが欲しいものですか?

は、それはすべきではない:

<cfreturn serializeJSON(structDSN)> 
+0

変数resが返されているはずです。しかし、エラーが発生したときに、受け取った引数をファイルにダンプする関数の内部にも入りません。api.html –

+0

ダンプ行をコメントアウトするとどうなりますか? –

+0

まだ試していない。私は明日オフィスに戻って、結果を知らせます。 –

関連する問題