【发布时间】:2019-06-09 23:06:35
【问题描述】:
我目前正在开发一个 NodeJS (Express) 项目,以使用 Exiftool 编辑图像的元数据。 要使用 Exiftool 编辑图像的元数据,我必须创建一个 JSON 文件,其中包含要修改的所有元数据,然后执行命令:
exiftool -j=metadata.json pathToTheImage/image.jpg
json 文件必须如下所示:
[{"SourceFile":"pathToTheImage/image.jpg","XMP-dc:Title":"Image's title"}]
这是我的代码:
const {exec} = require('child_process');
let fs = require('fs');
let uploadPath = "uploads";
let uploadName = "image.jpg";
...
app.post('/metadata/editor', (req, res) => {
let jsonToImport = [...];
fs.writeFileSync("metadata.json", JSON.stringify(jsonToImport));
exec('exiftool -j=metadata.json ' + uploadPath + '/' + uploadName, (error, stdout, stderr) => {
if (error) {
console.error(error);
return;
}
res.redirect('/metadata/checker/' + uploadName);
});
});
问题在于“writeFileSync/exec”级别。 这两行独立运行良好,也就是说,如果我只有第一行,那么 JSON 文件就创建好了。如果我只有第二行,图像的元数据就会得到很好的更新。 但是当我一起执行这两行时,JSON 文件创建得很好,但 exec 行“什么都不做”(或者我无法确定的事情)。 这段代码使用了同步函数,我用异步函数测试过,这是一样的行为。
目前,要做我需要的,我必须执行上面的代码来创建 JSON 文件,然后我必须注释 writeFileSync 行并且我必须重新执行代码以正确更新图像的元数据。
真的很奇怪,我尝试在 exec 行之前读取 JSON 文件内容,但一切正常。我使用过异步函数,有无承诺……没有什么可做的。
感谢您的帮助。
【问题讨论】:
-
Exec是同步函数,需要等待回调才能重定向用户
-
@user2821420,确实,我在问题的代码中错了,但问题仍然存在。我把它和 execSync() 搞混了。
标签: json node.js express exiftool