5

如果您正在运行节点,而我正在运行节点,有没有人看到一个解决方案,可以让我们保持一组文件同步。

同步很复杂,所以我认为可以将其留给unison(类似于 rsync)之类的工具,然后所有节点所要做的就是在经过身份验证的用户之间连接 TCP 管道。

filesystem1---unision==tcp==node.js------[http]----node.js==tcp====unison---filesystem2

它大概有 12 行 JavaScript,但目前它超出了我的范围,或者到目前为止我能找到的任何示例。

我查看了一大堆其他文件同步选项(例如 Git、veracity、fossil,包括尝试在 Linux 上安装 Simias iFolder 服务器的一周,失败〜看起来很有希望,因为它为每个主要操作系统都包含一个文件监视客户端)但现在我在想,可能会更简单得多。

如果有人见过这样做的 Node.js 项目,或者处于连接两个 TCP 管道不太难的水平,那么我将不胜感激您的来信

4

1 回答 1

0

我对这个问题采取的基本方法是使用stream2。
我的基本方法是这样的。

从第一个 tcp 获取数据

var gulp = require('gulp')
, thr = require('through2')
;


gulp.watch('rootDirectory/**/*', function(evt) {


  if ('deleted' === evt.type) {
    // do stuff if file is deleted
    return
  }

  // file got changed, moved or added.
  gulp.src(evt.path).pipe(thr(chunk, enc, next){
    // chunk is a vinyl filesytem object, 
    // so better fix chunk before sending to tcp server
    next(null, fixedChunk)

  }).pipe(toYourTcpServer)

})

然后在你的节点

var net = require('net')
, http = require('http')
;

var clientTcp = net.connect({port: 'toYourTcpServerPort'})

var server = http.createServer(function(req, res){
  clientTcp.pipe(res)
}).listen('somePort')

然后在另一端,你
在节点做相反的事情

var clientTcp2 = net.connect({port: 'toYourTcpServerPort2'})

var server2 = http.createServer(function(req, res){
  // fix response or something else.
  req.pipe(clientTcp2)
}).listen('somePort')

来自第二个 tcp

gutil = require('gulp-util')


clientTcp2.pipe(thr(function(chunk, enc, next){
  // You must create a vinyl filesystem before
  // sending down stream. Use new gutil.File()
  next(null, fixedChunk)

})).pipe(gulp.dest('finalDirectoy'))

through2创建转换流并gulp帮助您使用流创建任务。乙烯基文件只是 gulp 使用的一种抽象。

我希望这能让您了解如何使用流来解决您的问题,祝您好运

于 2014-05-17T20:55:58.163 回答