在Node.js中动态扩展管道链

时间:2017-06-09 12:06:29

标签: javascript node.js

我目前正在使用模块through2concat-streamrequest在Node.js中使用流。

我设置了这样的管道链条:

request(process.argv[2])
.pipe(through(write, end))
.pipe(/*And */)
.pipe(/* Some */)
.pipe(/* more */)
.on("finish",function (){ #Do some stuff });

function write(buf, enc, nxt){ 
    /*Push some data after some processing*/
}
function end(done){ 
    done()
}

这是一个静态的管道链。是否有可能通过某种形式的用户输入动态指定管道链?

在伪代码中:

array_of_user_pipes = from_some_input;
pipe_library = {pipe_name:pipe_callback} object, loaded into application logic

perform the url request (fetch .txt file over the internet)
for all pipe in array_of_user_pipes do 
  fetch pipe from pipe_library (simple key look-up)
  chain pipe to chain
execute the (dynamic) pipe chain

1 个答案:

答案 0 :(得分:1)

将伪代码转换为js

没有问题
const pipesMap = {
   pipeName1: require('pipe-module'),
   pipeName2: function(){},
   ...
}

定义一个piper函数,它接受管道名称并返回一个函数,用于管理每个管道的初始事件流。

const piper = pipes => request =>
      pipes.reduce((piped, pipe) => piped.pipe(pipesMap[pipe]), request)


const userInputPipesArray = ['pipeName1', 'pipeName2']

piper(userInputPipesArray)(request(process.argv[2])).on('finish')

修改

您可以使用for-loop

执行相同的操作
let piped = request(process.argv[2])

for(let pipe of userInputPipesArray) {
  piped = piped.pipe(pipeMap[pipe])
}

piped.on('finish', ...)