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]

那么为什么会这样呢?

4

2 回答 2

1

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

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

客户端上传到 Dropbox

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

服务器上传到 Dropbox

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

做什么?这取决于您使用的 Dropbox 包/解决方案以及您希望如何构建应用程序。

于 2017-02-17T14:09:38.817 回答
0

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

于 2017-02-17T11:58:34.867 回答