微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

AssertionError [ERR_ASSERTION]:子进程配置错误 其他信息 index.js child.js test.js index.js

如何解决AssertionError [ERR_ASSERTION]:子进程配置错误 其他信息 index.js child.js test.js index.js

我有一个test.js文件,该文件包含一个child_process并检查环境变量 MY_ENV_VAR ,该变量在我的index.js文件执行功能中设置。当我运行node test.js时,测试失败,并显示错误消息AssertionError [ERR_ASSERTION]:子进程配置错误。我已经尝试调试,但是没有任何结果可以得出可靠的结论。我认为子进程未收到正确的输出。以下是该练习所需的文件

其他信息

我向spawn方法添加了其他命令,这些命令在下面的index.js文件中得到了体现。现在,这会导致另一个断言错误,因为我的环境变量的长度不等于child.js文件中的 assertion.strictEqual 指定的长度。子进程正在接收系统环境变量,而不是相对于此进程的环境变量。因此,如果我可以限制环境变量的范围,则该程序将按预期运行。

index.js

'use strict'
const { spawn } = require('child_process')

function exercise (myEnvVar) {
  // Todo return a child process with
  // a single environment variable set 
  // named MY_ENV_VAR. The MY_ENV_VAR 
  // environment variable's value should 
  // be the value of the myEnvVar parameter 
  // passed to this exercise function
  process.env.MY_ENV_VAR = myEnvVar
  return spawn(process.execPath,['child.js','-e','process.env','process.stdout.pipe(process.stdout)','process.exit(0)']);
}
module.exports = exercise

child.js

'use strict'
const assert = require('assert')
const clean = (env) => Object.fromEntries(
  Object.entries(env).filter(([k]) => !/^(_.*|pwd|shlvl)/i.test(k))
)
const env = clean(process.env)

assert.strictEqual(env.MY_ENV_VAR,'is set')
assert.strictEqual(
  Object.keys(env).length,1,'child process should have only one env var'
)
console.log('passed!')

test.js

'use strict'
const assert = require('assert')
const { equal } = assert.strict
const exercise = require('.')

let sp = null
try {
  sp = exercise('is set')
  assert(sp,'exercise function should return a child process instance')
  if (Buffer.isBuffer(sp)) {
    equal(sp.toString().trim(),'passed!','child process misconfigured')
    process.stdout.write(sp)
    return
  }
} catch (err) { 
  const { status} = err
  if (status == null) throw err
  equal(status,'exit code should be 0')
  return
}

if (!sp.on) {
  const { stdout,stderr } = sp
  if (stderr.length > 0) process.stderr.write(stderr)
  if (stdout.length > 0) process.stdout.write(stdout)
  equal(sp.status,'exit code should be 0')
  equal(stdout.toString().trim(),'child process misconfigured')
  return
}

let out = ''
if (sp.stderr) sp.stderr.pipe(process.stderr)
if (sp.stdout) {
  sp.stdout.once('data',(data) => { out = data })
  sp.stdout.pipe(process.stdout)
} else {
  // stdio may be misconfigured,or fork method may be used,// allow benefit of the doubt since in either case
  // exit code check will still fail:
  out = 'passed!'
}
const timeout = setTimeout(() => {
  equal(out.toString().trim(),'child process misconfigured')
},1000)

sp.once('exit',(status) => {
  equal(status,'exit code should be 0')
  equal(out.toString().trim(),'child process misconfigured')
  clearTimeout(timeout)
})

欢迎所有帮助,谢谢

解决方法

我已经更新了index.js中的函数,并且代码按照常执行。正确的解决方案如下:

index.js

'use strict'
const { spawn } = require('child_process')

function exercise (myEnvVar) {
  // TODO return a child process with
  // a single environment variable set 
  // named MY_ENV_VAR. The MY_ENV_VAR 
  // environment variable's value should 
  // be the value of the myEnvVar parameter 
  // passed to this exercise function
  return spawn(process.execPath,['child.js'],{
    env: {MY_ENV_VAR: myEnvVar}
  });
}
module.exports = exercise
,

我相信我和你在做同一个项目。请注意,从 Node.js 版本 16 起,我们无法在 Windows 上使用以下代码清理子进程的环境变量。 (不过它在 Linux 上运行良好)

function exercise (myEnvVar) {
  // TODO return a child process with
  // a single environment variable set 
  // named MY_ENV_VAR. The MY_ENV_VAR 
  // environment variable's value should 
  // be the value of the myEnvVar parameter 
  // passed to this exercise function
  return spawn(process.execPath,{
    env: {MY_ENV_VAR: myEnvVar}
  });
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。