2016-05-09 4 views
0

Problem: Ich kann den ColdFusion-REST-Dienst nicht dazu veranlassen, eine Datenquelle zu erstellen, indem eine Anforderung von Node.js gesendet wird. Jedes Mal, wenn ich versuche, Daten von Node.js an meinen ColdFusion-Wiederherstellungsdienst zu senden, ist mein Argumentwert leer.Daten von node.js an einen Coldfusion-Ruhedienst senden

-Code für Daten von Node.js Entsendung

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'); 
    }); 

-Code für Coldfusion-REST-Service

<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> 

Wenn ich versuche, einschließlich headers Option in Variable htOptions ich die folgende Fehlermeldung erhalten

enter image description here

Wenn ich Header nicht enthalten, erhalte ich eine leere Zeichenfolge in meine Argumente und erhält einen Fehler

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

ich eine cfm Seite erstellt den Rest Dienst rufen und es erfolgreich erstellt die Datenquelle in Coldfusion Administrator

-Code

<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> 

Ich kann nicht herausfinden, was ich falsch mache.

+0

Welche Zeile von Ihnen node.js Code soll das Argument liefern? –

+0

Ihr CF-Post-Beispiel enthält keine Kopfzeile richtig? –

+0

Wenn Sie den Fehler 500 erhalten, wird irgendetwas in api.html angezeigt? –

Antwort

2

In Node.JS Sie verwenden 'Content-Type': 'application/x-www-form-urlencoded' Header, aber Sie kodieren, nicht richtig, die Daten für den Inhaltstyp.

Auch ich sehe Sie strDSN Argument aus Wunsch des Form erwarten, aber das ist nirgends darin definiert (es sei denn, ich irre, ich weiß nicht viel CF). Beim Abrufen von Formulardaten enthält die Textzeichenfolge für die Anfrage ; abgegrenzte argument=value Paare. Daher sollte es wie strDNS=URLEncodedData aussehen.

Also, entweder Sie tun

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

die strDSN=%7B%22name%22%3A+%22ab%22%7Dergeben wird (alle {, }, :, " und (space) sind URL-kodiert) siehe https://nodejs.org/dist/latest-v6.x/docs/api/querystring.html#querystring_querystring_stringify_obj_sep_eq_options

Oder Sie verwenden "Content-Type": "application/json" und

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

und dann müssen Sie wahrscheinlich deserializeJSON() die Anfrage Körper/Inhalt in Ihrem CF.

+0

Mit '" Content-Type ":" application/json "', konnte ich keinen Wert in Argument bekommen, das ich in eine Datei geworfen habe. Aber dein erster Vorschlag in deiner Antwort hilft mir, mein Problem zu lösen. Vielen Dank –

0

Ich bin mir nicht sicher, ob das Ihr Problem Dan ist, aber Sie haben einen Syntaxfehler in Ihrer Funktion CreateDataSource().

Ihre Rückkehr var ist wie folgt aufgebaut:

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

Sie die CF zurückkehren Struktur anstatt Ihre "res" Variable. Ist es das was du willst?

Sollte es nicht sein:

<cfreturn serializeJSON(structDSN)> 
+0

Variable Res sollte zurückgegeben werden. Aber wenn der Fehler auftritt, glaube ich, dass es nicht einmal in die Funktion gelangt, das Empfangsargument in die Datei dump.html api.html –

+0

Was passiert, wenn Sie diese Dump-Zeile auskommentieren? –

+0

Habe das noch nicht probiert. Ich werde es tun, wenn ich morgen wieder ins Büro komme und Sie über das Ergebnis informieren werde. –