当代码尝试加载文件时,我在以下指示的位置崩溃。文件内容被读取并显示在控制台上。但是当行
app.ports.receiveData.send(data.toString());
(试图)执行,代码崩溃。我已在代码下方附加了错误消息。此处的JS代码用于运行“无头”的Elm代码。应该调用app.ports...
函数将数据发送回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});
榆木代码
以下是相关的榆木代码部分。
loadFileCmd : String -> Cmd msg
loadFileCmd fileName =
sendFileName (E.string <| "./source/" ++ fileName)
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计算的数据发送到代表。
sendFileName
端口将文件路径发送到副本。 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)
从评论中,答案是替换行
app.ports.receiveData.send(data.toString());
with
main.ports.receiveData.send(data.toString());
因为Elm应用程序被命名为main
,而不是app
。