ReadStream和WriteStream到nodejs中的同一个文件

时间:2016-02-23 02:02:24

标签: javascript node.js coffeescript race-condition

我为同一个文件创建了WriteStreamReadStream

我正在测试用于在磁盘上保留对象的代码。

# Code
g:(stream, cb)->
   stream.on("data", (chunk) -> chunks.push(chunk))
   stream.on("end", () -> cb(MyComplexObjectClass.decode(Buffer.concat(chunks)))

# Test
it "allows to persist MyComplexObject to disk", (done) ->
  MyComplexObject = ... # Initialization code
  _in = fs.createWriteStream("XXX")
  out = fs.createReadStream("XXX")
  _in.write(MyComplexObject.encode())
  _in.end()
  g(out, (x) ->
    # Validation of x here, should be MyComplexObject
    done()
  )

测试通过三个问题:

  • 我认为存在争用条件:在end上调用_in时,更改可能无法刷新到文件中。如何在测试中重现竞争条件?
  • 交换_inout的声明会导致程序因Uncaught SyntaxError: Unexpected end of input而崩溃,尽管该文件存在,为什么会这样?
  • 有没有更好的方法来实现(仍使用流)?

1 个答案:

答案 0 :(得分:0)

这是一个评论但是太长了,根据反馈,我会修改。

有没有令人信服的理由不使用JSON.stringify?或类似的东西:

#assumes custom myObj#toString
fs.writeFile "myObj.js", "module.exports = #{myObj.toString()}", (err) ->
  if err then throw err
  var importedObj = require 'myObj.js'
  assert.equal myObj.toString(), importedObj.toString()

我喜欢溪流和下一个人一样,甚至使用RXJS将它们放到浏览器中,但这似乎是一个奇怪的用例。

修改

因此,根据您的反馈,至少要指出您的反馈意见,简短的答案是,您无法根据定义来可靠地测试竞争条件。如果可以,那就不会成为竞争条件。假设指令的非确定性交织。至于语法错误,每当我看到类似的东西,我检查输出javascript,它几乎总是以我不想要的方式编译cs。