NodeJS exif 返回 undefined

NodeJS exif returns undefined

提问人:Sup Acc 提问时间:9/23/2023 更新时间:9/23/2023 访问量:21

问:

我试图从我的图像中获取 exif 信息。所以我做了一些划痕。它可以工作,但在循环中使用它时不起作用

你好。我试图从我的图像中获取 exif 信息。所以我做了这个

const fs = require('fs');
const mime = require('mime');
const exif = require('exif-reader');
const ExifImage = require('exif').ExifImage;

function getFiles(dir, files = []) {
  const fileList = fs.readdirSync(dir);
  for (const file of fileList) {
    const name = `${dir}/${file}`;
    if (fs.statSync(name).isDirectory()) {
      getFiles(name, files);
    } else {
      files.push(name);
    }
  }
  return files;
}

function getEXIF(filepath){
    try {
        new ExifImage({ image : filepath }, function (error, exifData) {
            if (error)
                console.log('Error: '+error.message);
            else
                console.log(exifData.image); 
        });
    } catch (error) {
        console.log('Error: ' + error.message);
    }
}


//getEXIF('D://MyTestImage.jpg')


const filearr=getFiles('D://Photoes', files = [])
filearr.forEach((element) => {
     const ftype=mime.getType(element)
     if (ftype=='image/jpeg'){
         console.log(getEXIF(element))
     }
 }
 );

当我为一个特定文件运行函数 getEXIF 时,它工作正常。但是当我尝试在foreach循环中使用它时,它返回undefined。为什么?。我确定该元素包含文件的路径,因为它非常适合 mime.getType 函数并返回一个值。

请指出我的错误。

节点.js exif

评论

1赞 Konrad 9/23/2023
因为你没有返回任何东西,所以它什么也不返回(未定义)
0赞 Konrad 9/23/2023
这回答了你的问题吗?从 for 循环返回,但保持循环运行
0赞 Sup Acc 9/23/2023
但是getEXIF有console.log(exifData.image)它不应该打印结果吗?为什么它在没有循环的情况下工作,并且在循环中不起作用?

答:

2赞 Robin Thomas 9/23/2023 #1

首先,您需要重构 exif 数据。由于您没有返回任何东西,因此您会得到.getEXIF()undefined

其次,接受回调,该回调提供 作为第二个参数。ExifImageexifData

function (error, exifData) {}

从回调中获取 并使用它来响应的最简单方法是使用 PromiseexifDatagetEXIF

我们将 getEXIF 包装在一个 promise 中,然后使用 或 从回调中响应。ExifImagerejectresolve

async function getEXIF(filepath) {
   return new Promise((resolve, reject) => {
       try {
           new ExifImage({ image : filepath }, function (error, exifData) {
               if (error)
                   reject(error);
               else
                   resolve(exifData.image); 
           });
       } catch (error) {
           reject(error);
       }
   });
}

然后,您可以将其用作:

const exif = await getEXIF('D://MyTestImage.jpg');
console.log(exif)