Метеоритный метод получает данные как неопределенные

Так что у меня есть этот метод в моем компоненте

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]

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

2 ответа

Решение

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

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

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

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

сервер загружает в Dropbox

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

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

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

Другие вопросы по тегам