Есть ли модуль nodejs или пример того, как сделать файлы GridFS доступными через WebDAV? - PullRequest
1 голос
/ 18 ноября 2011

У меня есть приложение node.js, в котором у пользователей есть библиотека файлов, которые хранятся в GridFS.У каждого пользователя есть своя библиотека.Я хотел бы сделать библиотеку монтируемой с WebDAV, чтобы пользователь мог управлять своей библиотекой со своего рабочего стола.

Я видел jsDAV , используемый для доступа к файловой системе, но не ясно, какрасширить его для использования с виртуальной файловой системой.Я нашел gitDav , но не совсем понятно, как его использовать.

Возможно ли это, даже не начав с нуля?

Ответы [ 2 ]

2 голосов
/ 11 февраля 2015

Я хотел использовать 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);
1 голос
/ 26 ноября 2011

Похоже, что jsDAV - единственный вариант. Это порт библиотеки PHP, и он не настроен таким образом, что вы можете использовать его как обычный модуль node.js. Я нашел несколько примеров типов серверов, которые были созданы другими, чтобы соединить его с dropbox и couchdb .

Сейчас я работаю над типом сервера, который будет работать больше, чем вы ожидаете, что модуль node.js будет работать. Следующим шагом будет заставить его играть с npm. Вы можете увидеть мою вилку здесь .

...