未处理的运行时错误 - TypeError:无法读取未定义的属性“长度”Nextjs

问题描述

我正在编写代码以接受二维码图像并解码为字符串。

图片将是 Nextjs 文件夹 'public' 中的静态文件

在我的代码中,我已将图像转换为“imageData”。我成功转换并获得了返回一个 Uint8ClampedArray 的 'imageData' 对象。

ImageData object's console.log in browser

然后,我使用这个 npm 库来做 javascript QR 阅读器。 https://www.npmjs.com/package/jsqr

但是,不知何故,它把这个错误还给了我。

未处理的运行时错误 类型错误:无法读取未定义的属性“长度”

这是我的 localhost:3000 中的错误显示

Error in localhost:3000

当我查看我的代码编辑器时。我在第 372 行有突出显示

Where in detect in my code editor

虽然,我认为 .next 库中的第 372 行,我不应该对它做任何事情。

那可能是我的代码

这是我的代码

index.js

import Head from 'next/head'
import styles from '../styles/Home.module.css'
import jsQR from 'jsqr'
import { useEffect } from 'react'

export default function Home() {

  useEffect(() => {
    const canvas = document.getElementById("canvas");
    const ctx = canvas.getContext('2d');
    const width = 200;
    const height = 200;

    const image = new Image;
    var imageDataT
    image.src = './Test_QR_Coupon.png'
    image.onload = () => {
      ctx.drawImage(image,width,height);
      imageDataT = ctx.getimageData(0,200,200);
      console.log(imageDataT);
    }

    const code = jsQR(imageDataT,300,'dontInvert')
    console.log('Code:',code)
    if (code) {
      console.log("Found QR code",code);
    }
  })

  return (
    <div className={styles.container}>
      <Head>
        <title>Create Next App</title>
        <link rel="icon" href="/favicon.ico" />
      </Head>

      <main className={styles.main}>
        <canvas id="canvas"></canvas>
      </main>

      <footer className={styles.footer}>
        <a
          href="https://vercel.com?utm_source=create-next-app&utm_medium=default-template&utm_campaign=create-next-app"
          target="_blank"
          rel="noopener noreferrer"
        >
          Powered by{' '}
          <img src="/vercel.svg" alt="Vercel logo" className={styles.logo} />
        </a>
      </footer>
    </div>
  )
}

解决方法

您收到未定义错误,因为您在定义 imageDataT 的 onload 回调之前调用了 jsqr 函数。您需要将代码包装在回调中。

var imageDataT
image.src = './Test_QR_Coupon.png'
image.onload = () => {
  ctx.drawImage(image,width,height);
  imageDataT = ctx.getImageData(0,200,200);
  console.log(imageDataT);
  const code = jsQR(imageDataT,300,'dontInvert')
  console.log('Code:',code)
  if (code) {
    console.log("Found QR code",code);
  }
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...