2015-06-20 16 views
16

Attualmente sto cercando di eseguire la connessione lato server a iCloud Server utilizzando il nuovo CloudKit JS di Apple. Secondo il WWDC 2015 "CloudKit JS e servizio Web", poiché CloudKit JS è un framework JS puro, è possibile utilizzarlo in tutti gli ambienti JS come il nodo JS.Cloudkit JS && Node JS

Ho copiato il codice sorgente di CloudKit JS da https://cdn.apple-cloudkit.com/ck/1/cloudkit.js e incollato in un file denominato "cloudkit.js". Ecco una demo di quello che ho provato:

var CloudKit = require("/some/folders/cloudkit.js") 

function demoPerformQuery() { 
    CloudKit.configure({ 
     containers: [{ 
    containerIdentifier: 'myContainerIdentifier', 
    apiToken: 'myAPIToken', 
    environment: 'development' 
     }] 
    }) 

    var container = CloudKit.getDefaultContainer(); 
    var publicDB = container.publicCloudDatabase; 

    publicDB.performQuery({recordType: 'Items'}).then(function(response){ 
    // never called :-(
    }) 
} 

var express = require('express') 

var app = express() 

app.get("/", function(){ 
    demoPerformQuery() 
}) 

var server = app.listen(8080, function() { 
    console.log("server launched") 
}) 

CloudKit sembra essere impostato correttamente poiché tutte le funzioni sono chiamate correttamente. Ma il callback di performQuery non viene mai chiamato. Perché ?

C'è qualcuno che già riesce a configurare CloudKit JS in un ambiente server?

Grazie in anticipo

risposta

16

Nel browser, CloudKit.js si basa su XmlHttpRequest al fine di recuperare risorse, ma dal momento che CloudKit non è un modulo NPM avrete bisogno di un modo per andare a prendere le cose dal server.

npm install node-fetch

Utilizzando nodo-fetch, qui è una versione ottimizzato del codice che registra i risultanti prodotti che nella query:

var fetch = require('node-fetch'); 
var CloudKit = require("./cloudkit.js") 

CloudKit.configure({ 
    services: { 
    fetch: fetch 
    }, 
    containers: [{ 
    containerIdentifier: 'yourContainerIdentifier', 
    apiToken: 'yourAPItoken', 
    environment: 'development' 
    }] 
}) 

var container = CloudKit.getDefaultContainer(); 
var publicDB = container.publicCloudDatabase; 

function demoPerformQuery() { 
    publicDB.performQuery({recordType: 'Items'}).then(function(response){ 
    console.log(response) 
    }).catch(function(error){ 
    console.log(error) 
    }) 
} 

var express = require('express') 
var app = express() 

app.get("/", function() { 
    demoPerformQuery() 
}) 

var server = app.listen(8080, function() { 
    console.log("Server listen") 
}) 

Dopo aver colpito http://localhost:8080 si dovrebbe vedere il log del server la risposta alla la tua domanda.

+0

Grazie per la risposta. Ho ricevuto un errore: "Manca la promessa nativa, imposta Fetch.Promeggi alla tua alternativa preferita". Questo metodo ha funzionato per te? –

+2

Le promesse erano disponibili nel nodo dalla versione 0.11 (la versione corrente è 0.12). È possibile aggiornare il nodo o utilizzare qualcosa come https://github.com/jakearchibald/es6-promise come backfill. –

+1

Funziona come un fascino! Grazie mille. –