Метеоритный метод получает данные как неопределенные
Так что у меня есть этот метод в моем компоненте
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 ответа
Я подозреваю, что File, который вы пытаетесь передать методу, является дескриптором файла. если это правда, то это не сработает: даже если сервер получил эту информацию, у него нет доступа к вашей локальной файловой системе для захвата этих байтов.
Ваше решение будет принимать 1 из 2 форм:
клиент загружает в Dropbox
- клиент читает байты из файловой системы в память
- клиент загружает байты в dropbox
- клиент получает метаданные Dropbox о загруженном файле (например, местоположение)
- клиент вызывает сервер с этой информацией метаданных
- Сервер сохраняет эту информацию в БД
сервер загружает в Dropbox
- клиент читает байты из файловой системы в память
- клиент форматирует эти данные во что-то, что может быть обработано JSON
- клиент вызывает сервер с этим объектом JSON
- сервер загружает байты в dropbox
- сервер получает некоторые метаданные Dropbox о загруженном файле (например, местоположение)
- Сервер сохраняет эту информацию в БД
что делать? это зависит от того, какой пакет / решение Dropbox вы используете и как вы хотите структурировать свое приложение.
Вы возвращаете обещания, а не данные, вам нужно дождаться результата и затем вернуть данные.