节点子进程生成:标准输出返回未定义的值

Node Child Process Spawn: Stdout returning an Undefined Value

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

下面是一些显示问题的代码 - 这是一个子进程调用 python 脚本:

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代码很复杂,但我已经对其进行了全面测试:它是一个加密脚本,returns将密文输出到stdout。但这没关系。最重要的是,.on('data') 管道 returns 中的标准输出正常,但是在脚本关闭或调用 .on('end') 时,单个 "undefined" 被附加到 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"}
]

对此有什么想法吗?我的用例比这更复杂,我看不到自己只是解析未定义的 - 看起来真的很老套。

非常感谢!

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

相反,将其初始化为空字符串,您就不会遇到这种情况。