プロジェクト用にオートデスク 3D ビューア システムを作成しています。
3D モデル ファイル(*.rvt 拡張子)を meteor サーバーにアップロードし、Autodesk View and Data API を使用して変換しようとしています。
meteor-uploadsを使用してファイルをシステムにアップロードしています。このアップロードが完了すると、コールバック関数によって Meteor メソッド呼び出しがトリガーされ、このファイルが Autodesk API にアップロードされ、変換されます。
meteor アップロードのクライアント コード:
Template.uploader.helpers({
afterUpload: function(){
return {
finished:function(index,fileinfo,content){
console.log(fileinfo);
Meteor.call('translateFile', fileinfo.name, function(err,result){
console.log(result);
});
}
}
}
});
アップロードが開始される前であっても、コンソール ログには undefined が出力されます。以下はサーバーコードです
translateFile:function(name){
var filename =process.env.PWD + '/.data/' + name ;
var bucket =
'model'
+ new Date ().toISOString ().replace (/T/, '-').replace (/:+/g, '-').replace (/\..+/, '')
+ '-' + lmv.Lmv.getToken ().toLowerCase ().replace (/\W+/g, '') ;
var policy ='persistent' ;
console.log(bucket);
async.waterfall ([
function (callbacks1) {
console.log ('createBucketIfNotExist') ;
new lmv.Lmv(bucket).createBucketIfNotExist (policy)
.on ('success', function (data) {
console.log ('Bucket already or now exist!') ;
callbacks1 (null, data) ;
})
.on ('fail', function (err) {
console.log ('Failed to create bucket!') ;
callbacks1 (err) ;
})
;
},
function (arg1, callbacks2) {
console.log ('async upload') ;
new lmv.Lmv(bucket).uploadFile (filename)
.on ('success', function (data) {
console.log (filename + ' uploaded.') ;
callbacks2 (null, data) ;
})
.on ('fail', function (err) {
console.log ('Failed to upload ' + filename + '!') ;
callbacks2 (err) ;
})
;
},
function (arg1, callbacks3) {
console.log ('Launching translation') ;
var urn =JSON.parse (arg1).objects [0].id ;
new lmv.Lmv (bucket).register (urn)
.on ('success', function (data) {
console.log ('Translation requested.') ;
callbacks3 (null, data) ;
})
.on ('fail', function (err) {
console.log ('Failed to request translation!') ;
callbacks3 (err) ;
})
;
}
], function (err, results) {
console.log(results.urn);
console.log(results);
console.log(err);
if (err){
console.log(err);
return err;
}
if(results){
Document.insert({urn:results.urn,name:name});
console.log('inserting');
}
}) ;
console.log('---------------------HERE AT THE END---------------------')
},
クライアントコードは次のとおりです。
Meteor.call('translateFile', name, function(err,result){
console.log(result);
})
問題は、メソッドが未定義の値ですぐに戻り、最後のコールバック「挿入」のものを除いて、async.waterfall 内のすべてのコンソール ログが正しい順序で出力されることです。これは、 Document.insert 関数が呼び出されたり起動されたりせず、エラーも発生しないためです。
Futures ライブラリを試してみましたが、役に立ちませんでした。挿入関数を別のメソッド内に入れてみましたが、まだ使用できません。
どんなアイデアでも本当に役に立ちます。必要に応じて、さらに情報を提供させていただきます。