Meteor方法获取未定义的数据

时间:2017-02-17 08:21:06

标签: meteor meteor-methods

所以我在我的组件中有这个方法

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 个答案:

答案 0 :(得分:1)

我怀疑您尝试传递给该方法的文件是文件句柄。如果是,那么那就不行了:即使服务器确实获得了那些信息,它也无权访问你的本地文件系统以获取这些字节。

您的解决方案将采用以下两种形式之一:

客户端上传到Dropbox

  1. 客户端从文件系统读取字节到内存
  2. 客户端将字节上传到dropbox
  3. 客户端会收到有关上传文件(例如位置)的一些保管箱元数据
  4. 客户端使用该元数据信息调用服务器
  5. 服务器将该信息保存到db
  6. 服务器上传到dropbox

    1. 客户端从文件系统读取字节到内存
    2. 客户端将该数据格式化为可由JSON处理的内容
    3. 客户端使用该JSON对象调用服务器
    4. 服务器将字节上传到dropbox
    5. 服务器接收有关上传文件(例如位置)的一些保管箱元数据
    6. 服务器将该信息保存到db
    7. 该怎么办?这取决于您使用的Dropbox软件包/解决方案以及您希望如何构建应用程序。

答案 1 :(得分:0)

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