Node Child Process Spawn:Stdout返回未定义的值

时间:2017-08-16 00:25:39

标签: python node.js stdout child-process

处理应该是一个简单的问题,但我已经坚持了一段时间。可能与字符串编码,管道或其他完全不同 - 不确定。

这里有一些显示问题的代码 - 它是一个调用python脚本的子spawn:

const spawn = require('child_process').spawn;
let py = spawn('python', ['../py-docker-encryption/handle_encrypt.py']);

let encMsg = {action: 'enc', data: []}
encMsg.data.push(allArr[0].items.S)
let dataString;
py.stdout.on('data', (data) => {
  dataString += data.toString();
})
py.stdout.on('end', () => {
  console.log(dataString)
})
py.stdin.write(JSON.stringify(encMsg));
py.stdin.end()
// py.on('close', (code) => {
//   cb(null, dataString)
// })

python代码很复杂,但我已经对它进行了彻底的测试:它是一个加密脚本,它将密文返回给stdout。但这并不重要。最重要的是,.on('数据')管道中的标准输出正常返回,但是当脚本关闭时,或.on(' end')被调用时,单个& #34;未定义"被添加到dataString字符串的开头。例如,这是我的控制台(重要的是在开始时未定义 - 其余是正常操作):

    undefined[{"data": "AYADeJldNsBlMPApbYJydOfQ5msAXwABABVhd3MtY3J5cHRvLXB1YmxpYy1r
ZXkAREF3aUNDRWRHOTlUUHNYMFlwWVZLVnBPaHFxMDhiQ0NXOUkyWUVocEdTMWV4TkpjV0VxRnlFZ0xa
dkpIOVVmZEM1QT09AAEAB2F3cy1rbXMATmFybjphd3M6a21zOmV1LWNlbnRyYWwtMTo5MDUwNDk5MjMx
NjI6a2V5L2Q4NTNhNzdhLTJmMmMtNDRkNy04ZmNjLTE3MzNmZmVjYmM5NwC4AQIBAHg4n+ZTthRASUgK
QrDeQL96fA+8KdXwWlK3rIBH8nfwGQEln5SRtpBSM1tkyjxWDfoLAAAAfjB8BgkqhkiG9w0BBwagbzBt
AgEAMGgGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQMv+tUKJb0bdkvMe8FAgEQgDuy7Vx1nDBCUUGS
+GmG5gl7VcFP1e7t0BcSZ3KYeOgZDdZsH3iMXajtPktejPYzmBxFbxigN0ZQLXti2wIAAAAADAAAEAAA
AAAAAAAAAAAAAADhoAGEpZmeu/1Y+eOqL8OX/////wAAAAEAAAAAAAAAAAAAAAEAAAAEZ0I1VTfw2cHO
wx7ejXvVx9+vZjsAZzBlAjAw7KDk/iwWADqUfKmjyjKGrEab/bTUXu59A5xA0Db/L5JgCnhqlw3n8MTW
haVlqmwCMQDKSmZeKXJn0tvDYIYlVY20VwD+HRBTji/P62cREOE89iPbjLOykxeQJyqB3K7eGlA=\n"}
]

有关于此的任何想法吗?我的用例比这个更复杂,我不能看到自己只是解析未定义的 - 看起来真的很笨拙。

非常感谢!

1 个答案:

答案 0 :(得分:2)

dataString变量的初始值为undefined。当你强制转换为字符串时(在与另一个字符串连接时隐式完成),它使用文字'undefined',类似于null和许多其他非字符串值。

相反,将其初始化为空字符串,您将不会遇到此行为。