我有一个现有的node.js
应用程序,用户有一个用GridFS存储的文件库。每个用户都有自己的库。我想让图书馆与WebDAV挂载,这样用户就可以从桌面上管理他们的图书馆。
我见过jsDAV用于访问文件系统,但不清楚如何扩展它以与虚拟文件系统一起使用。我找到了gitDav,但不清楚如何使用它。
如果不从头开始,这可能吗?
我希望使用jsDAV通过WebDAV提供一些资源。由于找不到一个可行的例子,我研究了源代码中的注释,并自己写了一个。jsDAV是一个来自PHP库的端口。Sabre手册在一般情况下是有用的指南。需要记住的一点是,由于我们处于异步环境中,在PHP中返回结果的函数可能不得不调用回调函数。当所讨论的操作涉及到从磁盘读取时,通常会发生这种情况。回调的第一个参数将始终是一个错误对象,如果一切正常,它应该为空。
'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);
看起来jsDAV是唯一的选择。它是PHP库的一个端口,它的设置方式不像普通的node.js模块那样使用它。我发现了一些服务器类型的例子,其他人已经创建了连接dropbox和couchdb。
我现在正在工作的服务器类型,将工作更像你会期望一个node.js模块工作。下一步将是使它与npm兼容。你可以看到我的叉子在这里