Cra sh при попытке загрузить файл с помощью библиотеки repl Node - PullRequest
1 голос
/ 11 апреля 2020

Я получаю 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, которые имеют отношение.

  1. Этот код вызывается, когда пользователь хочет загрузить файл.
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)

1 Ответ

1 голос
/ 15 апреля 2020

Из комментариев ответом было заменить строку

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

на

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

, поскольку приложение Elm называется main, а не app.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...