如何在某些文件中使用此node.js模块

杰克

这是我的第三方node-js模块:

var knox = require('knox')
  , Resource = require('deployd/lib/resource')
  , httpUtil = require('deployd/lib/util/http')
  , formidable = require('formidable')
  , fs = require('fs')
  , util = require('util')
  , path = require('path');

function S3Bucket(name, options) {
  Resource.apply(this, arguments);
  if (this.config.key && this.config.secret && this.config.bucket) {
    this.client = knox.createClient({
        key: this.config.key
      , secret: this.config.secret
      , bucket: this.config.bucket
    });
  }
}
util.inherits(S3Bucket, Resource);
module.exports = S3Bucket;
S3Bucket.label = "S3 Bucket";

S3Bucket.prototype.clientGeneration = true;

S3Bucket.events = ["upload", "get", "delete"];
S3Bucket.basicDashboard = {
  settings: [{
      name: 'bucket'
    , type: 'string'
  }, {
      name: 'key'
    , type: 'string'
  }, {
      name: 'secret'
    , type: 'string'
  }]
};

S3Bucket.prototype.handle = function (ctx, next) {
  var req = ctx.req
    , bucket = this
    , domain = {url: ctx.url};

  if (!this.client) return ctx.done("Missing S3 configuration!");

  if (req.method === "POST" && !req.internal && req.headers['content-type'].indexOf('multipart/form-data') === 0) {
    var form = new formidable.IncomingForm();
    var remaining = 0;
    var files = [];
    var error;

    var uploadedFile = function(err) {
      if (err) {
        error = err;
        return ctx.done(err);
      } else if (!err) {
        remaining--;
        if (remaining <= 0) {
          if (req.headers.referer) {
            httpUtil.redirect(ctx.res, req.headers.referer || '/');
          } else {
            ctx.done(null, files);
          }
        }
      }
    };

    form.parse(req)
      .on('file', function(name, file) {
        remaining++;

        if (bucket.events.upload) {
          bucket.events.upload.run(ctx, {url: ctx.url, fileSize: file.size, fileName: file.filename}, function(err) {
            if (err) return uploadedFile(err);
            bucket.uploadFile(file.filename, file.size, file.mime, fs.createReadStream(file.path), uploadedFile);  
          });
        } else {
          bucket.uploadFile(file.filename, file.size, file.mime, fs.createReadStream(file.path), uploadedFile);
        }
      })
      .on('error', function(err) {
        ctx.done(err);
        error = err;
      });
    req.resume();
    return;
  }

  if (req.method === "POST" || req.method === "PUT") {

    domain.fileSize = ctx.req.headers['content-length'];
    domain.fileName = path.basename(ctx.url);

    if (this.events.upload) {
      this.events.upload.run(ctx, domain, function(err) {
        if (err) return ctx.done(err);
        bucket.upload(ctx, next);
      });
    } else {
      this.upload(ctx, next);
    }

  } else if (req.method === "GET") {
    if (ctx.res.internal) return next(); // This definitely has to be HTTP.

    if (this.events.get) {
      this.events.get.run(ctx, domain, function(err) {
        if (err) return ctx.done(err);
        bucket.get(ctx, next);
      });
    } else {
      this.get(ctx, next);
    }

  } else if (req.method === "DELETE") {

    if (this.events['delete']) {
      this.events['delete'].run(ctx, domain, function(err) {
        if (err) return ctx.done(err);
        bucket.del(ctx, next);
      }); 
    } else {
      this.del(ctx, next);
    }
  } else {
    next();
  }
};

S3Bucket.prototype.uploadFile = function(filename, filesize, mime, stream, fn) {
  var bucket = this;

  var headers = {
      'Content-Length': filesize
    , 'Content-Type': mime
  };

  this.client.putStream(stream, filename, headers, function(err, res) { 
    if (err) return ctx.done(err);
    if (res.statusCode !== 200) {
      bucket.readStream(res, function(err, message) {
        fn(err || message);
      });
    } else {
      fn();
    }
  });
};

S3Bucket.prototype.upload = function(ctx, next) {
  var bucket = this
    , req = ctx.req;

  var headers = {
      'Content-Length': req.headers['content-length']
    , 'Content-Type': req.headers['content-type']
  };

  this.client.putStream(req, ctx.url, headers, function(err, res) { 
    if (err) return ctx.done(err);
    if (res.statusCode !== 200) {
      bucket.readStream(res, function(err, message) {
        ctx.done(err || message);
      });
    } else {
      ctx.done();
    }
  });
  req.resume();
};

S3Bucket.prototype.get = function(ctx, next) {
  var bucket = this;
  var url = 'https://s3.amazonaws.com/' + this.config.bucket + ctx.url;

  httpUtil.redirect(ctx.res, url);
};

S3Bucket.prototype.del = function(ctx, next) {
  var bucket = this;

  this.client.deleteFile(ctx.url, function(err, res) {
    if (err) ctx.done(err);
    if (res.statusCode !== 200) {
      bucket.readStream(res, function(err, message) {
        ctx.done(err || message);
      });
    } else {
      ctx.done();
    }
  });
};

S3Bucket.prototype.readStream = function(stream, fn) {
  var buffer = '';
  stream.on('data', function(data) {
    buffer += data;
  }).on('end', function() {
    fn(null, buffer);
  }).on('error', function(err) {
    fn(err);
  });
};

里面的s3-amazon-aws文件夹,所以我做var s3bucket = require('s3-amazon-aws');

但是,现在如果我必须调用模块的handle函数,该怎么办?另外,它需要2个参数,例如ctx,next。如何获得这些参数?

任何帮助,将不胜感激。

盗贼大师

该模块导出S3Bucket构造函数。使用它来创建一个新对象。然后,您可以handle()在此对象上调用方法(因为它是对象原型的一部分)。

var S3Bucket = require('s3-amazon-aws');
var bucket = new S3Bucket(name, options);
bucket.handle(ctx, next)

关于各种参数,您需要阅读库的文档。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在Node.js Lambda中使用请求模块

来自分类Dev

如何在其他JS文件/模块中调用/使用此模块

来自分类Dev

在HTML中使用Node.js模块

来自分类Dev

在Node JS模块中使用dotenv

来自分类Dev

在node.js中使用异步模块

来自分类Dev

在node.js中使用异步模块

来自分类Dev

如何在node.js中使用xml文件?

来自分类Dev

Node js 逐行模块

来自分类Dev

如何在Node JS FS模块中使用Typescript Async / waiting with promise

来自分类Dev

如何在Node.js中使用repl获取模块功能的详细信息?

来自分类Dev

如何在Scala.js中使用AngularJS的模块配置?

来自分类Dev

如何在Ember.js中使用“从“模块名称”导入名称”语法包含javascript文件?

来自分类Dev

如何在node.js中使此功能异步

来自分类Dev

Node.js模块instanceof

来自分类Dev

Couchbase node.js模块

来自分类Dev

Node.js模块变量

来自分类Dev

Node.js中的模块

来自分类Dev

Couchbase node.js模块

来自分类Dev

Node.js模块的继承

来自分类Dev

Node.js模块“ this”重置

来自分类Dev

导出模块 Node.js

来自分类Dev

如何在Node.js中使用文件系统获取文件创建日期?

来自分类Dev

如何在带有twit模块的node.js中使用Twitter流式api跟踪用户列表的状态

来自分类Dev

如何在带有twit模块的node.js中使用Twitter流API跟踪用户列表的状态

来自分类Dev

Node.js模块文件和Concat

来自分类Dev

Node.js的文件存储抽象模块?

来自分类Dev

在Node JS中使用Express模块不起作用

来自分类Dev

如何在TypeScript中使用Node`http`模块

来自分类Dev

如何在电子 renderer.js 文件中使用 Node.js 解析 JSON?