[尝试使用Node的repl库加载文件时崩溃

问题描述 投票:1回答:1

当代码尝试加载文件时,我在以下指示的位置崩溃。文件内容被读取并显示在控制台上。但是当行

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});

榆木代码

以下是相关的榆木代码部分。

  1. 当用户想要加载文件时,将调用此代码。
loadFileCmd : String -> Cmd msg
loadFileCmd fileName =
    sendFileName (E.string <| "./source/" ++ fileName)
  1. 这些是用于与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端口监听文件内容。 (但我们会在发生这种情况之前崩溃)。

  1. 这里是订阅:
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)
node.js port elm read-eval-print-loop
1个回答
0
投票

从评论中,答案是替换行

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

with

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

因为Elm应用程序被命名为main,而不是app

© www.soinside.com 2019 - 2024. All rights reserved.