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

您正在返回承诺而不是数据,您必须等待结果并返回数据。