【发布时间】: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 代码相关的部分。
- 当用户想要加载文件时调用此代码。
loadFileCmd : String -> Cmd msg
loadFileCmd fileName =
sendFileName (E.string <| "./source/" ++ fileName)
- 这些是用于与 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 端口监听文件内容。 (但我们会在这发生之前崩溃)。
- 以下是订阅:
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