【问题标题】:ReadStream and WriteStream to the same file in nodejsReadStream和WriteStream到nodejs中的同一个文件
【发布时间】:2016-06-04 16:40:33
【问题描述】:

我为同一个文件创建了一个WriteStream 和一个ReadStream。

我正在测试将对象持久保存在磁盘上的代码。

# 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()
  )

测试通过,三个问题:

  • 我相信存在竞争条件:当在_in 上调用end 时,更改可能不会刷新到文件中。如何在测试中重现竞态条件?
  • 交换_in 和out 的声明会使程序与Uncaught SyntaxError: Unexpected end of input 一起崩溃,尽管该文件存在,这是为什么呢?
  • 有没有更好的方法来实现(仍然使用流)?

【问题讨论】:

    标签: javascript node.js coffeescript race-condition


    【解决方案1】:

    这是一条评论,但太长了,如果有反馈,我会修改。

    有什么令人信服的理由不使用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。

    【讨论】:

    • 我实际上在我的实现中使用 JSON.stringify,这不是问题的重点:1)如何证明竞争条件并对其进行测试? 2)为什么交换崩溃? 3)我想用同一个文件实现测试,还是
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-19
    • 2014-08-15
    • 1970-01-01
    • 2019-05-15
    • 2022-11-14
    • 2021-02-11
    相关资源
    最近更新 更多