0

この回答に従って、ファイルのアップロードを処理できるように独自のルートを作成しました。これが私が持っているものです:

var router = Connect.middleware.router(function(route) {
    route.post('/upload', function(req, res) {
        var filename = req.headers['x-filename'];
        var path = Path.join('.uploads', filename);
        var writeStream = FileSystem.createWriteStream(path);
        writeStream.on('error', function(e) {
            console.error(e);
            res.writeHead(500);
            res.end();
        }).on('close', function() {
            Fiber(function() {
                console.log(Meteor.user());
            }).run();
            res.writeHead(200);
            res.end();
        });
        req.pipe(writeStream);
    });
});
app.use(router);

これはファイルのアップロードには最適ですが、アクセスしようとすると次のMeteor.user()ようになります。

app/server/main.js:24
            }).run();
               ^
Error: Meteor.userId can only be invoked in method calls. Use this.userId in publish functions.
    at Object.Meteor.userId (app/packages/accounts-base/accounts_server.js:95:13)
    at Object.Meteor.user (app/packages/accounts-base/accounts_server.js:100:25)
    at app/server/main.js:23:36
Exited with code: 1

req私を助けるかもしれないオブジェクトには何も見えません。

ユーザー オブジェクトにアクセスする方法はありますか?


とりあえず、クライアント側のユーザー ID を取得し、それをヘッダーに渡します。ヘッダーを使用してサーバー側を検索します。

route.post('/upload', function(req, res) {
    Fiber(function() {
        var userId = req.headers['x-userid'];
        var user = Meteor.users.findOne({_id:userId});
        if(user) {
            ...
        } else {
            res.writeHead(403,'User not logged in');
            res.end();
        }
    }).run();
});

まったく安全ではないので、私はこれが好きではありません。別のユーザーのアカウントで何かをアップロードするのは簡単です。

編集:気にしないでください。呼び出すという行為そのものがMeteor.users.findOne({_id:userId});、何らかの形でアップロード ストリームを中断します。それを入れるとすぐに、すべてのファイルが破損します。彼らは最大約 700 KB をアップロードし、エラーなしで接続を停止して閉じます。

4

2 に答える 2