Я получаю cra sh в указанной точке ниже, когда код пытается загрузить файл. Содержимое файла читается и отображается на консоли. Но когда строка
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});
КОД ВЯЗА
Здесь являются частями кода 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 вычисляет, в реплику.
Порт sendFileName
отправляет путь файла в реплику. Порт receiveData
прослушивает содержимое файла. (Но мы сделаем sh, прежде чем это произойдет).
Вот подписки:
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)