Meteor 方法获取数据为未定义

Meteor method gets data as undefined

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

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

在我的数据对象中,我得到了所需的一切。这是控制台记录的内容

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]

为什么会这样?

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

我怀疑您尝试传递给该方法的文件是文件句柄。如果为真,那将不起作用:即使服务器确实获得了该信息,它也无法访问您的本地文件系统来获取这些字节。

您的解决方案将采用 2 种形式中的一种:

客户端上传到保管箱

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

服务器上传到保管箱

  1. 客户端从文件系统读取字节到内存
  2. 客户端将数据格式化为 JSON
  3. 可以处理的内容
  4. 客户端使用那个 JSON 对象调用服务器
  5. 服务器将字节上传到保管箱
  6. 服务器收到有关上传文件的一些保管箱元数据(例如位置)
  7. 服务器将该信息保存到数据库

做什么?这取决于您使用的是哪个保管箱 package/solution 以及您希望如何构建您的应用程序。