简体   繁体   中英

Crash when trying to load a file using Node's repl library

I am getting a crash at the indicated point below when the code attempts to load a file. The file contents are read and displayed on the console. But when the line

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

is (tried to) execute, the code crashes. I've attached the error message below the code. The JS code here is used to run some Elm code "headless". The app.ports... function call is supposed send data back to the Elm app. (The Elm Code is further down).

JS CODE:


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 CODE

Here are the parts the Elm code that are relevant.

  1. This code is called when the user wants to load a file.
loadFileCmd : String -> Cmd msg
loadFileCmd fileName =
    sendFileName (E.string <| "./source/" ++ fileName)
  1. These are the ports used to communicate with 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

The get port listens for commands the user gives to the repl and gives these commands to Elm to process. The put port sends data that Elm computes to the repl.

The sendFileName port sends a file path to the repl. The receiveData port listens for the file contents. (But we crash before this can happen).

  1. Here are the subscriptions:
subscriptions : Model -> Sub Msg
subscriptions _ =
    Sub.batch [ Command.get Input, Command.receiveData ReceiveFileContents ]

ERROR MESSAGE:

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)

From the comments, the answer was to replace the line

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

with

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

as the Elm app is named main , not app .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM