TL;DR

Это решение работает для Node v16.13.0 и NPM v8.1.3

Введение

Я не всегда ненавижу работать с NPM, если только он не начинает загружать тонны node_modules и выдавать не такие подробные логи. Сегодня мы с коллегой обнаружили ошибку входа в NPM, которую не так интересно и сложно отладить. У меня уходит около часа, чтобы выяснить, что является основной причиной.

В этой статье я напишу решение на тот случай, если вы столкнетесь с той же проблемой.

Нынешнее состояние

В моей нынешней компании мы используем Nexus3 в качестве частного репозитория для модуля NPM. Я также использую Node v12.22.4 и NPM v8.1.3 для работы на моей локальной машине. Чтобы войти в наш репозиторий Nexus, я использую .npmrc в следующем формате:

@myorg:registry=https://repo.myorg.com/repository/npm-private
always-auth=true
_auth={{ base64 of username:password redacted here }}

И мы довольны этим. Нет проблем.

Проблема

Проблема возникает, когда мой коллега хочет попробовать использовать Node v16.13.0. Когда выполняется команда npm i @myorg/utils, она начинает произносить 401.

npm ERR! code E401
npm ERR! Unable to authenticate, need: BASIC realm="Sonatype Nexus Repository Manager"
npm ERR! A complete log of this run can be found in:
npm ERR!     /home/user/.npm/_logs/2021-11-18T06_37_02_136Z-debug.log

Поиск решения

Интересно, это Nexus 3 несовместимо с Node v16 или что? Поэтому я попытался повторно войти в репозиторий Nexus.

$ npm login --registry=https://repo.myorg.com/repository/npm-private/ --scope=@myorg/
npm notice Log in on https://repo.myorg.com/repository/npm-private/
Username: {{ username }}
Password:
Email: (this IS public) {{ [email protected] }}
Logged in as {{ username }} on https://repo.myorg.com/repository/npm-private/.

Хорошо, теперь мы вошли в систему. Но как только я проверил с помощью npm whoami, он снова сказал 401.

$ npm whoami --registry=https://repo.myorg.com/repository/npm-private/
npm ERR! code E401
npm ERR! Unable to authenticate, need: BASIC realm="Sonatype Nexus Repository Manager"
npm ERR! A complete log of this run can be found in:
npm ERR!     /home/user/.npm/_logs/2021-11-18T06_49_38_788Z-debug.log

Затем я проверяю содержимое файла .npmrc, оказывается, что Node v16 имеет другой формат .npmrc. Вот мое текущее содержимое файла .npmrc:

//repo.myorg.com/repository/npm-private/:_authToken=NpmToken.{{ uuid redacted here }}

Какой странный формат. Это не отражает масштаба, также я все еще смущен самим форматом _authToken. Конечно, как хорошему разработчику, нам нужна быстрая рука для поиска наших ошибок по каждому ключевому слову в Google. И тут я нашла этот комментарий от @apottere. Итак, я попытался вручную переписать содержимое файла .npmrc. Это мое текущее содержимое файла .npmrc:

//repo.myorg.com/repository/npm-private/:always-auth=true
//repo.myorg.com/repository/npm-private/:_auth={{ base64 of username:password redacted here }}

Выглядит многообещающе, поэтому я снова попытался выполнить npm i @myorg/utils. И это не удалось.

$ npm install @myorg/utils
npm ERR! code E404
npm ERR! 404 Not Found - GET https://registry.npmjs.org/@myorg%2futils - Not found
npm ERR! 404
npm ERR! 404  '@myorg/utils@^0.2.0' is not in this registry.
npm ERR! 404 You should bug the author to publish it (or use the name yourself!)
npm ERR! 404
npm ERR! 404 Note that you can also install from a
npm ERR! 404 tarball, folder, http url, or git url.
npm ERR! A complete log of this run can be found in:
npm ERR!     /home/user/.npm/_logs/2021-11-18T07_04_32_033Z-debug.log

Ага, не нашел. Я думал, что это из-за того, что область действия не отражена в файле .npmrc.

Решение

Поэтому я попытался использовать старый способ, переписав содержимое вручную. Это мое текущее и окончательное содержимое файла .npmrc:

@myorg:registry=https://repo.myorg.com/repository/npm-private
//repo.myorg.com/repository/npm-private/:always-auth=true
//repo.myorg.com/repository/npm-private/:_auth={{ base64 of username:password redacted here }}

Наконец, я снова попробовал команду npm i @myorg/utils, и она сработала.

$ npm install @myorg/utils
added 1 package, and audited 2 packages in 2s
found 0 vulnerabilities

Заключение

Итак, это была команда npm login все это время. Я до сих пор не могу найти всю документацию по новому формату .npmrc, возможно, я пропустил документацию, а может, ее и нет. Если у вас возникла та же проблема, я надеюсь, что вы найдете эту статью и сможете решить проблему.

Спасибо за чтение!

Первоначально опубликовано на https://clavinjune.dev 18 ноября 2021 г.