2017-02-17 25 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

告訴我們關於「文件」的更多信息。它看起來像不能按原樣傳遞給服務器。作爲一個測試,嘗試傳遞一個簡單的值,比如一個字符串,以確保該方法可以接收該值。 – zim

回答

1

我懷疑你試圖傳遞給該方法的文件是一個文件句柄。如果這是真的,那麼這不起作用:即使服務器確實獲得了這些信息,它也無法訪問本地文件系統來獲取這些字節。

您的解決方案是要採取的1 2種形式:

客戶端上傳到收存箱

  1. 客戶端讀取從文件系統字節到存儲器
  2. 客戶端上載的字節到收存箱
  3. 客戶端收到一些有關上傳文件的Dropbox元數據(例如位置)
  4. 客戶端調用服務器元數據信息
  5. 服務器保存這些信息到數據庫

服務器上傳到收存箱

  1. 客戶端讀取文件系統字節到內存中的數據轉化爲可處理
  2. 客戶端格式通過JSON
  3. 客戶端與該JSON對象調用服務器
  4. 服務器上傳由使用Dropbox
  5. 服務器收到一些關於上傳文件的Dropbox元數據(例如,位置)
  6. 服務器保存這些信息到數據庫

該怎麼辦?這取決於您使用的Dropbox套件/解決方案以及您想要構建應用程序的方式。

0

您正在返回承諾而不是數據,您必須等待結果並返回數據。