我想通过节点的子进程exec方法运行一个命令,该方法将包含一个JSON字符串,该字符串本身将包含引号字符。看起来exec默认会删除它们。有办法防止这种情况吗?
我正在尝试在netlify中自动创建构建挂钩,这是我们目前正在尝试进行的一些自动化QA的一部分。目前,我正在使用netlify cli(特别是他们的netlify api createSiteBuildHook
方法)来进行此操作。我想捕获此命令的输出以及向命令中注入一些数据,因此我尝试使用节点的子进程exec()
命令来解决此问题。我在这里遇到的问题是netlify命令期望将JSON字符串用作该命令的参数,并且事实证明,exec默认情况下会删除引号,出于安全原因,我推测是。我希望有办法解决这个问题。
我尝试过并考虑过的一些替代方法:
\"
,^"
等。我用来生成构建挂钩的命令:
yarn netlify api createSiteBuildHook -d {"site_id":"my-site-id","body":{"title":"my-title","branch":"my-branch"}}
我用于通过exec运行此代码的代码:
yargs
.command(
'createBuildHook',
'Creates a build hook in netlify',
{},
async () => {
const buildHookRequest = JSON.stringify({
site_id: process.env.NETLIFY_MASTER_ID,
body: {
title: branchName(),
branch: branchName(),
}
});
const cmd = exec(`yarn netlify api createSiteBuildHook -d ${buildHookRequest}`, (err, stout) => {
if (err) {
console.log(`Error: ${err}`);
}
console.log(`Output: ${stout}`);
});
}
)
.demandCommand().argv;
我尝试运行命令时遇到的错误:
$ yarn qa-automate:createBuildHook
yarn run v1.16.0
$ yarn qa-automate createBuildHook
$ babel-node --presets @babel/preset-env -- ./qa-automation/cli.js createBuildHook
Error: Error: Command failed: yarn netlify api createSiteBuildHook -d {"site_id":"my-site-id","body":{"title":"my-title","branch":"my-branch"}}
SyntaxError: Unexpected token s in JSON at position 1
at JSON.parse (<anonymous>)
at APICommand.run (C:/Users/owen_jones/web-work/website-assets/node_modules/netlify-cli/src/commands/api.js:45:61)
error Command failed with exit code 1.
Output: $ C:\Users\owen_jones\web-work\website-assets\node_modules\.bin\netlify api createSiteBuildHook -d {site_id:my-site-id,body:{title:my-title,branch:my-branch}}
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
Done in 3.92s.
您可以在输出中看到它已经去除了引号。可能是其他原因在进行剥离,但我无法解决。
答案 0 :(得分:1)
不是exec
,而是外壳。
您可以通过在每个引号(和反斜杠)之间加上反斜杠来解决此问题:
const cmd = exec(`yarn netlify api createSiteBuildHook -d ${buildHookRequest.replace(/[\\"]/g, "\\$&")}`, (err, stout) => {
这可能不是强大的通用解决方案,但对于您正在做的事情可能已经足够了。 (我的快速本地测试足够通过JSON了。)