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 种形式中的一种:
客户端上传到保管箱
- 客户端从文件系统读取字节到内存
- 客户端上传字节到保管箱
- 客户端收到有关上传文件的一些保管箱元数据(例如位置)
- 客户端使用该元数据信息调用服务器
- 服务器将该信息保存到数据库
服务器上传到保管箱
- 客户端从文件系统读取字节到内存
- 客户端将数据格式化为 JSON
可以处理的内容
- 客户端使用那个 JSON 对象调用服务器
- 服务器将字节上传到保管箱
- 服务器收到有关上传文件的一些保管箱元数据(例如位置)
- 服务器将该信息保存到数据库
做什么?这取决于您使用的是哪个保管箱 package/solution 以及您希望如何构建您的应用程序。
所以我的组件中有这个方法
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 种形式中的一种:
客户端上传到保管箱
- 客户端从文件系统读取字节到内存
- 客户端上传字节到保管箱
- 客户端收到有关上传文件的一些保管箱元数据(例如位置)
- 客户端使用该元数据信息调用服务器
- 服务器将该信息保存到数据库
服务器上传到保管箱
- 客户端从文件系统读取字节到内存
- 客户端将数据格式化为 JSON 可以处理的内容
- 客户端使用那个 JSON 对象调用服务器
- 服务器将字节上传到保管箱
- 服务器收到有关上传文件的一些保管箱元数据(例如位置)
- 服务器将该信息保存到数据库
做什么?这取决于您使用的是哪个保管箱 package/solution 以及您希望如何构建您的应用程序。