この回答に従って、ファイルのアップロードを処理できるように独自のルートを作成しました。これが私が持っているものです:
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 をアップロードし、エラーなしで接続を停止して閉じます。