Canonical and noindex aren’t two versions of the same fix; they are two tools for two different jobs, and you choose by deciding what should happen to the duplicate page’s signals. Treating them as interchangeable ways to handle duplicate content is what leads to the wrong one.
Use canonical when the pages are true equivalents and you want their signals consolidated. A canonical tag tells Google that several near-identical URLs are the same content and names the one to keep, and it folds the link and relevance signals from the duplicates into that chosen URL. The duplicate pages stay live and eligible, but the ranking value pools onto one version instead of splitting across several. So canonical is the tool when the duplicate has signals worth keeping and you want them merged upward into a single representative page.
Use noindex when a page should stay live for users but never compete in search. The noindex directive drops a page from the results entirely; Google obeys it and removes the page, but it does not forward that page’s signals anywhere, because a page out of the index has nothing to pass on. So noindex is the tool when the page needs to exist for people, a thin variant, a utility page, a filtered view, but has no business ranking and carries no signals you are trying to preserve.
That is the test. Ask whether the duplicate’s signals should merge into another page, in which case canonical, or whether the page should simply leave search while staying available to users, in which case noindex, and don’t reach for one when you meant the other.