【问题标题】:Crash when trying to load a file using Node's repl library尝试使用 Node 的 repl 库加载文件时崩溃
【发布时间】:2020-04-10 23:37:56
【问题描述】:

当代码尝试加载文件时,我在下面的指示点发生崩溃。文件内容被读取并显示在控制台上。但是当行

app.ports.receiveData.send(data.toString());

是(试图)执行,代码崩溃。我已在代码下方附加了错误消息。这里的 JS 代码是用来“无头”运行一些 Elm 代码的。 app.ports... 函数调用应该将数据发送回 Elm 应用程序。 (Elm 代码在下面)。

JS 代码:


const repl = require('repl');
const fs = require('fs')



// Link to Elm code
var Elm = require('./main').Elm;
var main = Elm.Tool.init();


// Eval function for the repl
function eval(cmd, _, _,  callback) {
  main.ports.put.subscribe(
    function putCallback (data) {
      main.ports.put.unsubscribe(putCallback)
      callback(null, data)
    }
  )
  main.ports.get.send(cmd)
}


main.ports.sendFileName.subscribe(function(data) {
  var path =  data
  // console.log(path)
  fs.readFile(path, { encoding: 'utf8' }, (err, data) => {
    if (err) {
      console.error(err)
      return
    }
    console.log(data.toString())
    // Crash on next line !!!!
    app.ports.receiveData.send(data.toString());
  })
});


function myWriter(output) {
  return output
}

console.log("\nType 'h' for help\n")

repl.start({ prompt: '> ', eval: eval, writer: myWriter});

榆树代码

以下是 Elm 代码相关的部分。

  1. 当用户想要加载文件时调用此代码。
loadFileCmd : String -> Cmd msg
loadFileCmd fileName =
    sendFileName (E.string <| "./source/" ++ fileName)
  1. 这些是用于与 JS 通信的端口
port get : (String -> msg) -> Sub msg
port put : String -> Cmd msg

port sendFileName : E.Value -> Cmd msg
port receiveData : (E.Value -> msg) -> Sub msg

get 端口侦听用户向 repl 发出的命令,并将这些命令交给 Elm 进行处理。 put 端口将 Elm 计算的数据发送到 repl。

sendFileName 端口向 repl 发送文件路径。 receiveData 端口监听文件内容。 (但我们会在这发生之前崩溃)。

  1. 以下是订阅:
subscriptions : Model -> Sub Msg
subscriptions _ =
    Sub.batch [ Command.get Input, Command.receiveData ReceiveFileContents ]

错误消息:

repl.js:573
      const lines = errStack.split(/(?<=\n)/);
                             ^

TypeError: errStack.split is not a function
    at Domain.debugDomainError (repl.js:573:30)
    at Domain.emit (events.js:321:20)
    at Domain.EventEmitter.emit (domain.js:485:12)
    at Domain._errorHandler (domain.js:253:23)
    at Object.<anonymous> (domain.js:156:29)
    at process._fatalException (internal/process/execution.js:164:29)

【问题讨论】:

  • 您能否编辑问题以包含您尝试运行的 Elm 代码(或至少是重现您所描述问题的缩减版)?
  • 是的,在问题中添加了一个包含 Elm 代码相关部分的部分。
  • 谢谢,但我想说还有其他相关部分。应用程序是如何启动的?你在用Browser.element吗?如果是这样,鉴于基本上没有视图,您如何处理视图层?如果您不使用Browser.element,您是如何连接订阅的?目前,如果我想尝试重现您的问题,我必须猜测这些丢失的位是什么。如果您可以包含足够的 Elm 代码以允许我编译和运行您的代码,那将是理想的:它不必是您的完整应用程序,只要足以重现问题即可。
  • 我会看看我是否将应用程序缩减为一个非常小的演示,以便更好地隔离问题。在 Elm 方面,我使用的是Platform.Worker。非常感谢你看这个。
  • 我查看了该代码。它与我在关于app.ports 的评论中提到的相同错误,当我修复它时,它似乎可以工作,因为我可以加载文件并读取其内容。

标签: node.js port elm read-eval-print-loop


【解决方案1】:

从 cmets 来看,答案是替换行

app.ports.receiveData.send(data.toString());

main.ports.receiveData.send(data.toString());

因为 Elm 应用程序被命名为 main,而不是 app

【讨论】:

    猜你喜欢
    • 2019-09-10
    • 1970-01-01
    • 2015-12-11
    • 2018-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多