2015-06-20 80 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

工程就像一个魅力!非常感谢你。 –