2017-02-17 9 views
0

Так что у меня этот метод в моем компонентеметод Метеор получает данные в виде неопределенного

uploadCallback (file) { 
    // TODO: Integrate dropbox with its SDK 
    // TODO: Pass the link to the editor 
    return new Promise(
     (resolve, reject) => { 
     console.log('uploadCallback promise') 
     console.log('file', file) 
     const dataObject = { 
      file, 
      resolve, 
      reject 
     } 
     console.log('dataObject', dataObject) 
     Meteor.call('uploadToDropbox', dataObject, function (error, result) { 
      console.log('uploadToDropbox callback') 
      if (error) { 
      console.log('error', error) 
      } 
      if (result) { 
      console.log('result', result) 
      } 
     }) 
     } 
    ) 
    } 

В моей DataObject я получаю все, как нужно. Вот что такое консольные журналы

uploadCallback promise 
file File {name: "nodejs-2560x1440.png", lastModified: 1485410804857, lastModifiedDate: Thu Jan 26 2017 10:06:44 GMT+0400 (+04), webkitRelativePath: "", size: 1699460…} 
dataObject Object {file: File} 
uploadToDropbox callback 

Так что все, кажется, здесь хорошо.

И вот мой код сервера

import { Meteor } from 'meteor/meteor' 
import Dropbox from 'dropbox' 

console.log('dropbox settings', Meteor.settings.dropbox) 
const dbx = new Dropbox({accessToken: Meteor.settings.dropbox.accessToken}) 

Meteor.methods({ 
    'uploadToDropbox': function (dataObject) { 
    console.log('dataObject', dataObject) 
    const { file } = dataObject 
    console.log('file', file) 
    const { resolve, reject } = dataObject 
    console.log('resolve', resolve) 
    console.log('reject', reject) 
    dbx.filesUpload({path: '/' + file.name, contents: file}) 
     .then(function (response) { 
     console.log(response) 
     resolve({ data: { link: 'http://dummy_image_src.com' } }) 
     }) 
     .catch(function (error) { 
     console.error(error) 
     reject('some error') 
     }) 
    return false 
    } 
}) 

Проблема здесь. dataObject это передается почти пустой Это то, что сервер журналы

I20170217-11:44:36.141(4)? dataObject { file: {} } 
I20170217-11:44:36.143(4)? file {} 
I20170217-11:44:36.143(4)? resolve undefined 
I20170217-11:44:36.144(4)? reject undefined 
W20170217-11:44:36.371(4)? (STDERR) [TypeError: first argument must be a string or Buffer] 

Так почему же это происходит?

+0

Сообщите нам о "File". Похоже, что это невозможно передать на сервер, как есть. В качестве теста попробуйте передать простое значение, например строку, чтобы убедиться, что метод может получить это. – zim

ответ

1

Я подозреваю, что файл, который вы пытаетесь передать методу, является дескриптором файла. если это правда, то это не сработает: даже если сервер действительно получил эту информацию, у него нет доступа к вашей локальной файловой системе, чтобы захватить эти байты.

ваше решение будет принимать 1 из 2 форм:

клиента загрузки в Dropbox

  1. клиент считывает байт из файловой системы в памяти
  2. клиента добавления байтов Dropbox
  3. клиент получает некоторые метаданные метаданных о загруженном файле (например, местоположение)
  4. клиент вызывает сервер с этим Информация о метаданных
  5. сервера сохраняет, что информация в БД

загрузки сервера в Dropbox

  1. клиент считывает байты из файловой системы в память
  2. клиентских форматов данные в то, что могут быть обработаны by JSON
  3. клиент вызывает сервер с этим объектом JSON
  4. сервер загружает tes to dropbox
  5. сервер получает некоторые метаданные метаданных о загруженном файле (например, место)
  6. сервер сохраняет, что информация в БД

который делать? это зависит от того, какой пакет/решение Dropbox вы используете, и как вы хотите структурировать свое приложение.

0

Вы возвращаете обещания, а не данные, вам нужно ждать результата, а затем возвращать данные.