1

ユーザーが GridFS に保存されているファイルのライブラリを持っている既存のnode.jsアプリがあります。各ユーザーには独自のライブラリがあります。ユーザーが自分のライブラリをデスクトップから管理できるように、ライブラリを WebDAV でマウントできるようにしたいと考えています。

ファイルシステムへのアクセスに使用されるjsDAVを見たことがありますが、仮想ファイル システムで使用するためにそれを拡張する方法が明確ではありません。gitDavを見つけましたが、使用方法が明確ではありません。

これはゼロから始めなくても可能ですか?

4

2 に答える 2

2

私は jsDAV を使用して、WebDAV を通じていくつかのリソースを利用できるようにしようとしていました。実際の例が見つからなかったので、ソースのコメントを調べて自分で書きました。jsDAV は、PHP ライブラリからのポートです。Sabre マニュアルは、一般的に役立つガイドです。覚えておくべきことの 1 つは、非同期環境にいるため、PHP で結果を返す関数は、代わりにコールバック関数を呼び出さなければならない場合があるということです。これは通常、問題の操作にディスクからの読み取りが含まれる場合に発生します。コールバックの最初のパラメータは常にエラー オブジェクトであり、すべてがうまくいくと null になるはずです。

'use strict';

var crypto = require('crypto');

var jsDAV = require("jsDAV/lib/jsdav");
var jsDAVLocksBackendFS = require("jsDAV/lib/DAV/plugins/locks/fs");
var jsDAVFile = require("jsDAV/lib/DAV/file");
var jsDAVCollection = require("jsDAV/lib/DAV/collection");
var jsExceptions = require("jsDAV/lib/shared/exceptions");

var VirtualFile = jsDAVFile.extend(
{    
    initialize: function(name, buffer) {
        this.name = name;
        this.buffer = buffer;
    },

    getName: function() {
        return this.name;
    },

    get: function(callback) {
        callback(null, this.buffer);
    },

    put: function(data, type, callback) {
        callback(new jsExceptions.Forbidden("Permission denied to change data"));
    },

    getSize: function(callback) {
        callback(null, this.buffer.length);
    },

    getETag: function(callback) {
        var shasum = crypto.createHash('sha1');
        shasum.update(this.buffer);
        var etag = '"' + shasum.digest('hex') + '"';
        callback(null, etag);
    },

    getContentType: function(callback) {
        callback(null, 'text/plain');
    }    
});

var VirtualDirectory = jsDAVCollection.extend(
{
    initialize: function(name, children) {
        this.name = name;
        this.children = children;        
    },

    getChildren: function(callback) {
        var list = [];
        for (var name in this.children) {
            list.push(this.children[name]);
        }
        callback(null, list);
    },

    getChild: function(name, callback) {
        var child = this.children[name];
        if (child) {
            callback(null, child);
        } else {
            callback(new jsExceptions.NotFound("File not found"));
        }
    },

    childExists: function(name, callback) {
        var exists = (this.children[name] !== undefined);
        callback(null, exists);
    },

    getName: function() {
        return this.name;
    }
});

var children = {};
for (var i = 1; i <= 10; i++) {
    var name = 'file' + i + '.txt';
    var text = 'Hello world, #' + i;
    children[name] = VirtualFile.new(name, new Buffer(text, 'utf8'));
}

var grandchildren = {};
for (var i = 66; i <= 99; i++) {
    var name = 'beer' + i + '.txt';
    var text = i + ' bottles of beer';
    grandchildren[name] = VirtualFile.new(name, new Buffer(text, 'utf8'));
}
children['folder'] = VirtualDirectory.new('folder', grandchildren);

var root = VirtualDirectory.new(null, children);

var options = {
    node: root,
    locksBackend: jsDAVLocksBackendFS.new(__dirname + "/data")
};
var port = 8000;

jsDAV.createServer(options, port);
于 2015-02-11T11:49:24.340 に答える
1

jsDAV が唯一のオプションのようです。これは PHP ライブラリのポートであり、通常の node.js モジュールのように使用できるようには設定されていません。他の人が作成したサーバータイプの例をいくつか見つけて、それを dropbox およびcouchdb に接続まし

私は現在、node.js モジュールが機能することを期待するように機能するサーバー タイプに取り組んでいます。次のステップは、npm でうまく動作するようにすることです。ここで私のフォークを見ることができます。

于 2011-11-26T12:19:12.697 に答える