1

我有一个现有的node.js应用程序,其中用户有一个使用 GridFS 存储的文件库。每个用户都有自己的库。我想使用 WebDAV 使库可挂载,以便用户可以从他们的桌面管理他们的库。

我见过jsDAV用于访问文件系统,但不清楚如何扩展它以与虚拟文件系统一起使用。我找到了 gitDav但不清楚如何使用它。

这甚至可以不从头开始吗?

4

2 回答 2

2

我希望使用 jsDAV 通过 WebDAV 提供一些资源。找不到一个可行的例子,我研究了源代码中的评论并自己写了一个。jsDAV 是 PHP 库的一个端口。Sabre 手册通常是有用的指南。要记住的一件事是,由于我们处于异步环境中,因此在 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 模块一样使用它的方式进行设置。我发现了一些其他人创建的服务器类型示例,用于将其与dropboxcouchdb连接起来。

我现在正在研究一种服务器类型,它的工作方式更像您期望的 node.js 模块工作。下一步将使它与 npm 配合使用。你可以在这里看到我的叉子。

于 2011-11-26T12:19:12.697 回答