cnpm/cnpmjs.org

npm ERR! 409 Conflict - PUT https://[cnpm]/-/user/org.couchdb.user:[username] - [conflict] User [username] already exists

helloint opened this issue · 1 comments

故障描述:
C:\Users\Administrator>npm adduser [username] --registry https://[cnpm]/ --verbose

npm info it worked if it ends with ok
npm verb cli [
npm verb cli   'C:\\Program Files\\nodejs\\node.exe',
npm verb cli   'C:\\Program Files\\nodejs\\node_modules\\npm\\bin\\npm-cli.js',
npm verb cli   'adduser',
npm verb cli   '[username]',
npm verb cli   '--registry',
npm verb cli   'https://[cnpm]/',
npm verb cli   '--verbose'
npm verb cli ]
npm info using npm@6.13.4
npm info using node@v12.16.1
npm verb config Skipping project config: C:\Users\Administrator/.npmrc. (matches userconfig)
npm verb npm-session 11db8dfd5fbbf248
npm verb web login before first POST
npm http fetch POST 404 https://[cnpm]/-/v1/login 191ms
npm verb web login not supported, trying couch
Username: [username]
Password:
Email: (this IS public) [username]@[domain]
npm verb login before first PUT {
npm verb login   _id: 'org.couchdb.user:[username]',
npm verb login   name: '[username]',
npm verb login   password: 'XXXXX',
npm verb login   type: 'user',
npm verb login   roles: [],
npm verb login   date: '2020-12-18T02:07:18.924Z'
npm verb login }
npm http fetch PUT 422 https://[cnpm]/-/user/org.couchdb.user:[username] 29ms
npm verb adduser before first PUT {
npm verb adduser   _id: 'org.couchdb.user:[username]',
npm verb adduser   name: '[username]',
npm verb adduser   password: 'XXXXX',
npm verb adduser   email: '[username]@[domain]',
npm verb adduser   type: 'user',
npm verb adduser   roles: [],
npm verb adduser   date: '2020-12-18T02:07:18.982Z'
npm verb adduser }
npm http fetch PUT 409 https://[cnpm]/-/user/org.couchdb.user:[username] 28ms
npm verb stack Error: 409 Conflict - PUT https://[cnpm]/-/user/org.couchdb.user:[username] - [conflict] User [username] already exists
npm verb stack     at C:\Program Files\nodejs\node_modules\npm\node_modules\npm-registry-fetch\check-response.js:104:15
npm verb stack     at processTicksAndRejections (internal/process/task_queues.js:97:5)
npm verb statusCode 409
npm verb cwd C:\Users\Administrator
npm verb Windows_NT 6.1.7601
npm verb argv "C:\\Program Files\\nodejs\\node.exe" "C:\\Program Files\\nodejs\\node_modules\\npm\\bin\\npm-cli.js" "adduser" "[username]" "--registry" "https://[cnpm]/" "--verbose"
npm verb node v12.16.1
npm verb npm  v6.13.4
npm ERR! code E409
npm ERR! 409 Conflict - PUT https://[cnpm]/-/user/org.couchdb.user:[username] - [conflict] User [username] already exists
npm verb exit [ 1, true ]
npm timing npm Completed in 9562ms

npm ERR! A complete log of this run can be found in:
npm ERR!     C:\Users\Administrator\AppData\Roaming\npm-cache\_logs\2020-12-18T02_07_19_099Z-debug.log

故障出现的时机:
之前都处于登录状态, 使用正常.
最近一次发布, 提示无权限, 所以又login了一次, 就报这个错误了.

尝试的方法:
网上找了和409相关的异常, 没有解决.
打开 https://[cnpm]/-/user/org.couchdb.user:[username], 显示:

{
"_id": "org.couchdb.user:[username]",
"_rev": "1-6193adf6692cd36ebfa4b04257001bbc",
"name": "[username]",
"email": "[username]@domain",
"type": "user",
"roles": [],
"date": "2020-03-13T14:42:07.000Z",
"_cnpm_meta": {
"id": 9,
"npm_user": false,
"custom_user": false,
"gmt_create": "2020-03-13T14:42:07.000Z",
"gmt_modified": "2020-03-13T14:42:07.000Z"
}
}

换了台机器, 登录同样的账号, 同样报409, 说明是账号问题. 而且发现和密码正确与否无关.

请问是什么原因? 怎么解决?

问题解决了
进到mysql里, 把user表的username rename, 比如username_old
然后重新登陆, 让他重新创建用户信息, 即可.
发现cnpm的权限管理是通过username string匹配的, 而不是id 外键, 所以这个方案应该是安全的.
经过测试, 权限依旧有效.

问题原因分析是猜测用户的登陆状态同步cache导致的.
感觉登录分两部分, 前半段逻辑发现用户不存在, 所以决定在mysql创建user, 后半段实际创建时, 发现db里已经有这个用户了, 所以返回409.
重启cnpm无效, 说明这个cache不是存在内存里的, 但找不到还有哪里可以持久化.

猜测是因为我们通过--registry=https://[cnpm]/的形式, 同时登陆登出cnpm和npm的账号引起的问题.
时间原因, 没有继续细究.