Mam więc tę metodę w moim komponencie

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)
          }
        })
      }
    )
  }

W moim DataObject dostaję wszystko w razie potrzeby. Oto, co dzienniki konsoli

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

Więc wszystko wydaje się być w porządku tutaj.

A oto mój kod serwera

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
  }
})

Problem polega na tym. dataObject jest przekazywany prawie pusty To właśnie dzienniki serwera

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]

Dlaczego tak się dzieje?

0
Hayk Safaryan 17 luty 2017, 11:21

2 odpowiedzi

Najlepsza odpowiedź

Podejrzewam, że plik, który próbujesz przejść do metody, jest uchwyt pliku. Jeśli prawda, to nie będzie działać: nawet jeśli serwer otrzymał tę informację, nie ma dostępu do lokalnego systemu plików, aby chwycić te bajty.

Twoje rozwiązanie zajmie 1 z 2 form:

klient przesyłają do Dropbox

  1. Klient odczytuje bajty z systemu plików do pamięci
  2. Przesyłanie klienta bajtów do Dropbox
  3. Klient odbiera metadane Dropbox o przesłanym pliku (np. Lokalizacja)
  4. Serwer połączeń klientów z informacjami o metadanych
  5. Serwer zapisuje tę informację do DB

serwer przesyłający do Dropbox

  1. Klient odczytuje bajty z systemu plików do pamięci
  2. Klient formatuje dane do czegoś, co można obsługiwać JSON
  3. Serwer połączeń klientów z tym obiektem JSON
  4. Serwer przesyłaj bajty do Dropbox
  5. Serwer odbiera metadane Dropbox o przesłanym pliku (np. Lokalizacja)
  6. Serwer zapisuje tę informację do DB

Co zrobić? To zależy od tego, który opakowanie / rozwiązanie Dropbox, którego używasz i jak chcesz strukturę swojej aplikacji.

1
zim 17 luty 2017, 14:09

Wracasz obietnice, a nie dane, musisz czekać na wynik, a następnie zwrócić dane.

0
perusopersonale 17 luty 2017, 11:58