Cloudkit JS && Node JS

26

我目前正在尝试使用苹果的新CloudKit JS在服务器端连接iCloud服务器。根据2015 WWDC“CloudKit JS和Web服务”,由于CloudKit JS是一个纯JS框架,因此您可以在所有JS环境中使用它,例如node JS。

我从https://cdn.apple-cloudkit.com/ck/1/cloudkit.js复制了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?

提前致谢。

1个回答

23

在浏览器中,CloudKit.js 依赖 XmlHttpRequest 来获取资源,但由于 CloudKit 不是一个 npm 模块,您需要一种从服务器获取内容的方式。

npm install node-fetch

使用 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 后,您应该看到服务器记录响应您查询的日志。


感谢您的回复。我遇到了一个错误:“本地承诺丢失,请将Fetch.Promise设置为您喜欢的替代方法”。这种方法对您有用吗? - GaétanZ
2
承诺在节点版本0.11中可用(当前版本为0.12)。您可以升级节点或使用类似https://github.com/jakearchibald/es6-promise的东西作为回填。 - Dave Browning
1
非常好用!非常感谢。 - GaétanZ
var fetch = require('node-fetch'); fetch.Promise = require('es6-promise').Promise; - Sung Wook Moon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接