2015-06-20 2 views
16

В настоящее время я пытаюсь выполнить подключение на стороне сервера к серверу iCloud, используя новый CloudKit JS от Apple. Согласно WWDC 2015 «CloudKit JS и веб-сервис», поскольку 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, кажется, правильно настроить, так как все функции правильно называется. Но обратный вызов executeQuery никогда не вызывается. Зачем ?

Есть ли кто-то, кто уже успел настроить CloudKit JS в среде сервера?

Заранее спасибо

ответ

16

В браузере CloudKit.js полагается на XmlHttpRequest для того, чтобы извлекать ресурсы, но так как CloudKit не модуль НПМ вам нужен способ для извлечения вещи с вашего сервера.

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

Работает как очарование! Большое спасибо. –