1

この質問がこれまでに行われたことがあるかどうかはわかりません。インターネットを閲覧してファイルのアップロードに関する回答を探していたのですが、正しい質問が見つかりません。これが問題です:サーバーにファイルをアップロードしたいです。そして、これは大丈夫です。サーバーにファイルをアップロードする方法について話し合っている多くの議論を見つけました。

今私の問題は、ファイルが効果的にアップロードされたこと、またはエラーが発生したかどうかをクライアントに伝える方法が見つからないことです...私は Meteor.call('methodName', args, function(error, result){//some code});クライアントとサーバーでこれを試してきました:

Meteor.methods({
    saveFile: function (blob, name, path, encoding) {
        var fs = __meteor_bootstrap__.require('fs');
        var path = badgesHelper.cleanPath(path);
        var name = badgesHelper.cleanName(name || 'file');
        var encoding = encoding || 'binary';
        path = Meteor.chroot + path + '/';
        console.log(path, name, encoding);

        var uploadResult = {success: false};

        fs.writeFile(path + name, blob, encoding, function (error) {
            if (error) {
                uploadResult.error = error
                Meteor.Error(500, 'An error occurred');
            } else {
                var date = new Date();
                uploadResult.success = true;
            }
        });
        return uploadResult;
    }
});

そして、uploadResultマップをクライアントに送信する方法が見つかりません。呼び出しは非同期であるため、コールバック関数が呼び出される前にノードが「return」に到達し、uploadResultが関数の実際の結果を取得します...filepicker.ioを使用したくない任意のパッケージ。

私がこれを間違った方法でやっているなら、アドバイスしてください、今のところ私はそこで立ち往生しています...

ありがとうございました

4

1 に答える 1

0

値を返すだけなので、ここではマップは必要ありませんboolean。直接返すことができます。エラーの場合は、代わりにそれをスローできますfalsethrow new Meteor.Error()また、ただの代わりに必要がありますMeteor.Error()

変更を加えたコード:

Meteor.methods({
    saveFile: function (blob, name, path, encoding) {
        var fs = __meteor_bootstrap__.require('fs');
        var path = badgesHelper.cleanPath(path);
        var name = badgesHelper.cleanName(name || 'file');
        var encoding = encoding || 'binary';
        path = Meteor.chroot + path + '/';
        console.log(path, name, encoding);

        var uploadResult = false;

        fs.writeFile(path + name, blob, encoding, function (error) {
            if (error) {
                // EDIT: Throws an error
                // error.error = 500; error.reason = "An error occurred";
                throw new Meteor.Error(500, 'An error occurred');
            } else {
                // result = true
                return true;
            }
        });
    }
});
于 2013-03-04T17:11:39.130 に答える