2015-06-20 158 views
16

我正在嘗試使用Apple的新CloudKit JS執行服務器端連接到iCloud Server。根據WWDC 2015「CloudKit JS和Web Service」,由於CloudKit JS是一個純JS框架,因此您可以在所有JS環境(如節點JS)中使用它。Cloudkit JS && Node JS

我複製了CloudKit JS的源代碼https://cdn.apple-cloudkit.com/ck/1/cloudkit.js,並將其粘貼到名爲「cloudkit.js」的文件中。這裏是什麼,我嘗試了演示:

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似乎是正確設置,因爲所有的功能都正常調用。但performQuery的回調從未被調用過。爲什麼?

是否有人已經成功在服務器環境中配置CloudKit JS?

在此先感謝

回答

16

在瀏覽器中,CloudKit.js依靠的XmlHttpRequest爲了獲取資源,但由於CloudKit不是NPM模塊,您需要一種方法來從服務器抓取你的東西。

npm install node-fetch

使用節點取,這裏是你的代碼的一個扭捏版本,登錄您的查詢的結果條目:

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") 
}) 

http://localhost:8080後,你應該看到您的服務器登錄到響應您的查詢。

+0

感謝您的回覆。我得到一個錯誤:「原生承諾失蹤,將Fetch.Promise設置爲您最喜歡的替代方案」。這種方法對你有用嗎? –

+2

從版本0.11開始,節點中可以使用承諾(當前版本爲0.12)。您可以升級節點或使用類似https://github.com/jakearchibald/es6-promise的回填作爲​​回填。 –

+1

工程就像一個魅力!非常感謝你。 –