node-webkit教程(7)Platform Service之APP

node-webkit教程(7)Platform ServiceAPP

文/玄魂

 

前言

几个月前,要开发一个简易的展示应用,要求支持离线播放(桌面应用)和在线播放(web应用)。

当时第一想到的是flex,同一套代码(或者只需少量的更改)就可以同时运行在桌面和浏览器上。由于很多展现效果要全新开发,我想到了impress.js(https://github.com/bartaz/impress.js/)。如果选择impress.js,就意味着要将html5作为桌面应用,当时想到要封装webkit,但是本人对这方面也不是很熟悉,时间也很有限,就又沿着这个方向搜索,找到了node-webkit(https://github.com/rogerwang/node-webkit)

node-webkit解决了我通过htmljs来编写桌面应用的难题

至于node-webkit的定义,按照作者的说法:

 基于node.jschromium的应用程序实时运行环境,可运行通过HTML(5)CSS(3)Javascript来编写的本地应用程序。node.jswebkit的结合体,webkit提供DOM操作,node.js提供本地化操作;且将二者的context完全整合,可在HTML代码中直接使用node.jsAPI

从本篇文章开始,为您介绍Platform Services些列的API,本系列由以下类别:

·             App – 每个应用运行时全局api

·             Clipboard – 剪贴板

·             Tray – 状态栏图标,消息通知

·             File dialogs-文件选择对话框

·             Shell – 桌面相关

·             Handling files and arguments-处理文件和相关参数

 

7.1  APP 概述

APP类别的API 是针对当前正在运行的应用程序实例的,换个说法是进程级别的(这样说还不准确,node-webkit每一个窗口在单独进程中,应用本身是多进程的)。这些API和程序的启动、关闭关系最密切。但是从目前文档中的API来看,APP类别的API显得不是很丰富。

新建appDemo.htmlpackage.json文件。

package.json内容如下:

{

  "name": "app-demo",

  "main": "appDemo.html",

  "nodejs":true,

   "window": {

    "title": "appDemo",

    "toolbar": true, 

    "width": 800, 

    "height": 600,

   "resizable":true,

   "show_in_taskbar":true,

   "frame":true,

   "kiosk":false,

   "icon": "2655716405282662783.png",

  },

  "webkit":{

  "plugin":true

  }

}

appDemo.html内容如下:

<html>

<head>

    <title>appDemo</title>

    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

</head>

<body >

    <h1>app api 测试</h1>

    <script>

        // Load native UI library

        var gui = require('nw.gui');

        var win = gui.Window.get();

    </script> 

</body>

</html>

7.1  获取APP对象

通过如下方式获得APP对象:

  // Load native UI library

        var gui = require('nw.gui');

        var app = gui.App;

7.2 获取命令行参数

鄙视不标明出处的转载,更多相关内容,欢迎访问玄魂的博客www.xuanhun521.com

 

很多时候,我们启动程序需要从命令行输入参数,可以通过argvfullArgvfilteredArgv获取输入参数。关于三者的区别参考:https://github.com/rogerwang/node-webkit/wiki/App#fullargv。我的测试结果和文档还是有出入的。

修改appDemo.html如下:

<html>

<head>

    <title>appDemo</title>

    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

</head>

<body >

    <h1>app api 测试</h1>

    <script>

        // Load native UI library

        var gui = require('nw.gui');

        var app = gui.App;

        apendText(app.argv);

        apendText(app.fullArgv);

        apendText(app.filteredArgv);

        function apendText(text)

        {

            var element = document.createElement('div');

            element.appendChild(document.createTextNode(text));

            document.body.appendChild(element);

        }

    </script> 

</body>

</html>

在命令行启动程序:

运行结果如下:

7.3 DATAPATH

应用的数据存储目录,在不同的操作系统上路径不同,Windows: %LOCALAPPDATA%/<name>

Linux: ~/.config/<name>;

OSX:~/Library/Application Support/<name>

这里的<name>是在package.json中定义的name字段的值,所以需要在定义name值的时候保证全局唯一。

7.4 获取MANIFEST

使用manifest属性,可以获取package.json中的json对象。修改appDemohtml的脚本内容如下:

    <script>

        // Load native UI library

        var gui = require('nw.gui');

        var app = gui.App;

 

        var manifest = app.manifest;

        apendText(manifest.name);

 

        function apendText(text)

        {

            var element = document.createElement('div');

            element.appendChild(document.createTextNode(text));

            document.body.appendChild(element);

        }

    </script>

结果如下:

7.5 清除缓存

鄙视不标明出处的转载,更多相关内容,欢迎访问玄魂的博客www.xuanhun521.com

可以调用clearCache()方法,清除应用在内存和磁盘上的缓存。

7.6 关闭程序

关闭程序有两个函数可以调用,分别为closeAllWindows()quit()方法,两者的区别在于closeAllWindows()方法会发送窗口的关闭消息,我们可以监听close事件(参考:http://www.xuanhun521.com/Blog/2014/4/14/node-webkit%E5%AD%A6%E4%B9%A04native-ui-api-%E4%B9%8Bwindow),阻止窗口关闭或者做其他日志等工作。quit()方法不会发送任何消息,直接退出程序。

7.7 CRASH DUMP

node-webkit  0.8.0版本开始,如果应用崩溃,一个minidump 文件会被保存到磁盘,用以调试和寻找程序崩溃的原因。默认情况下,dump文件保存在系统的临时文件夹中,我们也可以通过api来设置dump文件的存放目录。以下是个版本系统的临时目录:

·      Linux: /tmp

·      Windows: System temporary directory

·      Mac: ~/Library/Breakpad/product name (product name is defined in .plist file in the application bundle)

为了方便测试,node-webkit提供了App.crashBrowser()App.crashRenderer()两个api,分别保存browser 进程和render进程的数据。下面我们通过实例演示将dump文件保存到本地磁盘D

    <script>

        // Load native UI library

        var gui = require('nw.gui');

        var app = gui.App;

 

        app.setCrashDumpDir('d:\\');//设置转储目录

        app.crashBrowser();

        app.crashRenderer();

   

        function apendText(text)

        {

            var element = document.createElement('div');

            element.appendChild(document.createTextNode(text));

            document.body.appendChild(element);

        }

    </script>

运行程序,应用启动后会崩溃退出,在D盘会看到转储文件:

如何查看转储文件,这里就不详细介绍了,会在专门的文章中讲解,读者现在可以参考文档中的链接:

Decoding the stack trace

To extract the stack trace from the minidump file, you need the minidump_stackwalk tool, symbols file of node-webkit binary and the minidump (.dmp) file generated from the crash.

See http://www.chromium.org/developers/decoding-crash-dumps

http://code.google.com/p/google-breakpad/wiki/GettingStartedWithBreakpad

Symbols file of official node-webkit binary is provided staring from 0.8.0. It can be downloaded from:

Resources

Linux symbol files of breakpad

https://s3.amazonaws.com/node-webkit/v0.8.0/nw.breakpad.ia32.gz

https://s3.amazonaws.com/node-webkit/v0.8.0/nw.breakpad.x64.gz

windows pdb file

https://s3.amazonaws.com/node-webkit/v0.8.0/nw.exe.pdb.zip

mac dSYM files

https://s3.amazonaws.com/node-webkit/v0.8.0/node-webkit-osx-dsym-v0.8.0.tar.gz

7.8  获取代理

使用getProxyForURL(url),可以获得加载该url时使用的代理信息。返回值使用PAC格式(参考:http://en.wikipedia.org/wiki/Proxy_auto-config)。

 

7.6 小结

本文内容主要参考node-webkit的官方英文文档,做了适当的调整(https://github.com/rogerwang/node-webkit/wiki/App

https://github.com/rogerwang/node-webkit/wiki/Crash-dump)。

下一篇文章,介绍Clipboard

鄙视不标明出处的转载,更多相关内容,欢迎访问玄魂的博客www.xuanhun521.com

更多相关内容,欢迎访问玄魂的博客(更多node-webkit相关内容 http://www.xuanhun521.com/Blog/Tag/node-webkit)

ps:nw.js,electron交流群 313717550 

 


本文转自玄魂博客园博客,原文链接:http://www.cnblogs.com/xuanhun/p/3670906.html,如需转载请自行联系原作者

F:\vue3new\Ch-08\shop-backend>npm start > shop-backend@1.0.0 start > node development.js [2025-06-01T12:06:07.254] [34872] [INFO] - Server running at http://127.0.0.1:8360 [2025-06-01T12:07:45.601] [34872] [INFO] - ThinkJS version: 3.2.15 [2025-06-01T12:07:45.602] [34872] [INFO] - Environment: development [2025-06-01T12:07:45.602] [34872] [INFO] - Workers: 1 [2025-06-01T12:07:57.318] [30344] [INFO] - mysql://root:123456@127.0.0.1:3306/vueshop Error: ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client at Handshake.Sequence._packetToError (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\protocol\sequences\Sequence.js:47:14) at Handshake.ErrorPacket (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\protocol\sequences\Handshake.js:123:18) at Protocol._parsePacket (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\protocol\Protocol.js:291:23) at Parser._parsePacket (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\protocol\Parser.js:433:10) at Parser.write (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\protocol\Parser.js:43:10) at Protocol.write (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\protocol\Protocol.js:38:16) at Socket.<anonymous> (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\Connection.js:88:28) at Socket.<anonymous> (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\Connection.js:526:10) at Socket.emit (node:events:507:28) at addChunk (node:internal/streams/readable:559:12) -------------------- at Protocol._enqueue (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\protocol\Protocol.js:144:48) at Protocol.handshake (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\protocol\Protocol.js:51:23) at PoolConnection.connect (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\Connection.js:116:18) at Pool.getConnection (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\Pool.js:48:16) at F:\vue3new\Ch-08\shop-backend\node_modules\think-helper\index.js:83:10 at new Promise (<anonymous>) at F:\vue3new\Ch-08\shop-backend\node_modules\think-helper\index.js:82:12 at ThinkMysql.getConnection (F:\vue3new\Ch-08\shop-backend\node_modules\think-mysql\index.js:89:69) at F:\vue3new\Ch-08\shop-backend\node_modules\think-mysql\index.js:229:21 at F:\vue3new\Ch-08\shop-backend\node_modules\think-debounce\index.js:19:16 { code: 'ER_NOT_SUPPORTED_AUTH_MODE', errno: 1251, sqlMessage: 'Client does not support authentication protocol requested by server; consider upgrading MySQL client', sqlState: '08004', fatal: true } { request: { method: 'GET', url: '/', header: { host: '127.0.0.1:8360', connection: 'keep-alive', 'sec-ch-ua': '"Microsoft Edge";v="137", "Chromium";v="137", "Not/A)Brand";v="24"', 'sec-ch-ua-mobile': '?0', 'sec-ch-ua-platform': '"Windows"', 'upgrade-insecure-requests': '1', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36 Edg/137.0.0.0', accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7', 'sec-fetch-site': 'none', 'sec-fetch-mode': 'navigate', 'sec-fetch-user': '?1', 'sec-fetch-dest': 'document', 'accept-encoding': 'gzip, deflate, br, zstd', 'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6' } }, response: { status: 200, message: 'OK', header: [Object: null prototype] { 'x-powered-by': 'thinkjs-3.2.15' } }, app: { subdomainOffset: 2, proxy: false, env: 'development' }, originalUrl: '/', req: '<original node req>', res: '<original node res>', socket: '<original node socket>' } [2025-06-01T12:07:57.335] [30344] [INFO] - GET / 500 680ms [2025-06-01T12:07:57.533] [30344] [INFO] - GET /favicon.ico 404 2ms Error: ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client at Handshake.Sequence._packetToError (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\protocol\sequences\Sequence.js:47:14) at Handshake.ErrorPacket (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\protocol\sequences\Handshake.js:123:18) at Protocol._parsePacket (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\protocol\Protocol.js:291:23) at Parser._parsePacket (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\protocol\Parser.js:433:10) at Parser.write (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\protocol\Parser.js:43:10) at Protocol.write (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\protocol\Protocol.js:38:16) at Socket.<anonymous> (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\Connection.js:88:28) at Socket.<anonymous> (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\Connection.js:526:10) at Socket.emit (node:events:507:28) at addChunk (node:internal/streams/readable:559:12) -------------------- at Protocol._enqueue (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\protocol\Protocol.js:144:48) at Protocol.handshake (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\protocol\Protocol.js:51:23) at PoolConnection.connect (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\Connection.js:116:18) at Pool.getConnection (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\Pool.js:48:16) at F:\vue3new\Ch-08\shop-backend\node_modules\think-helper\index.js:83:10 at new Promise (<anonymous>) at F:\vue3new\Ch-08\shop-backend\node_modules\think-helper\index.js:82:12 at ThinkMysql.getConnection (F:\vue3new\Ch-08\shop-backend\node_modules\think-mysql\index.js:89:69) at F:\vue3new\Ch-08\shop-backend\node_modules\think-mysql\index.js:229:21 at F:\vue3new\Ch-08\shop-backend\node_modules\think-debounce\index.js:19:16 { code: 'ER_NOT_SUPPORTED_AUTH_MODE', errno: 1251, sqlMessage: 'Client does not support authentication protocol requested by server; consider upgrading MySQL client', sqlState: '08004', fatal: true } { request: { method: 'GET', url: '/', header: { host: '127.0.0.1:8360', connection: 'keep-alive', 'cache-control': 'max-age=0', 'sec-ch-ua': '"Microsoft Edge";v="137", "Chromium";v="137", "Not/A)Brand";v="24"', 'sec-ch-ua-mobile': '?0', 'sec-ch-ua-platform': '"Windows"', 'upgrade-insecure-requests': '1', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36 Edg/137.0.0.0', accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7', 'sec-fetch-site': 'none', 'sec-fetch-mode': 'navigate', 'sec-fetch-user': '?1', 'sec-fetch-dest': 'document', 'accept-encoding': 'gzip, deflate, br, zstd', 'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6' } }, response: { status: 200, message: 'OK', header: [Object: null prototype] { 'x-powered-by': 'thinkjs-3.2.15' } }, app: { subdomainOffset: 2, proxy: false, env: 'development' }, originalUrl: '/', req: '<original node req>', res: '<original node res>', socket: '<original node socket>' } [2025-06-01T12:08:21.584] [30344] [INFO] - GET / 500 12ms Error: ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client at Handshake.Sequence._packetToError (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\protocol\sequences\Sequence.js:47:14) at Handshake.ErrorPacket (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\protocol\sequences\Handshake.js:123:18) at Protocol._parsePacket (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\protocol\Protocol.js:291:23) at Parser._parsePacket (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\protocol\Parser.js:433:10) at Parser.write (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\protocol\Parser.js:43:10) at Protocol.write (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\protocol\Protocol.js:38:16) at Socket.<anonymous> (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\Connection.js:88:28) at Socket.<anonymous> (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\Connection.js:526:10) at Socket.emit (node:events:507:28) at addChunk (node:internal/streams/readable:559:12) -------------------- at Protocol._enqueue (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\protocol\Protocol.js:144:48) at Protocol.handshake (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\protocol\Protocol.js:51:23) at PoolConnection.connect (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\Connection.js:116:18) at Pool.getConnection (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\Pool.js:48:16) at F:\vue3new\Ch-08\shop-backend\node_modules\think-helper\index.js:83:10 at new Promise (<anonymous>) at F:\vue3new\Ch-08\shop-backend\node_modules\think-helper\index.js:82:12 at ThinkMysql.getConnection (F:\vue3new\Ch-08\shop-backend\node_modules\think-mysql\index.js:89:69) at F:\vue3new\Ch-08\shop-backend\node_modules\think-mysql\index.js:229:21 at F:\vue3new\Ch-08\shop-backend\node_modules\think-debounce\index.js:19:16 { code: 'ER_NOT_SUPPORTED_AUTH_MODE', errno: 1251, sqlMessage: 'Client does not support authentication protocol requested by server; consider upgrading MySQL client', sqlState: '08004', fatal: true } { request: { method: 'GET', url: '/', header: { host: '127.0.0.1:8360', connection: 'keep-alive', 'cache-control': 'max-age=0', 'sec-ch-ua': '"Microsoft Edge";v="137", "Chromium";v="137", "Not/A)Brand";v="24"', 'sec-ch-ua-mobile': '?0', 'sec-ch-ua-platform': '"Windows"', 'upgrade-insecure-requests': '1', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36 Edg/137.0.0.0', accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7', 'sec-fetch-site': 'none', 'sec-fetch-mode': 'navigate', 'sec-fetch-user': '?1', 'sec-fetch-dest': 'document', 'accept-encoding': 'gzip, deflate, br, zstd', 'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6' } }, response: { status: 200, message: 'OK', header: [Object: null prototype] { 'x-powered-by': 'thinkjs-3.2.15' } }, app: { subdomainOffset: 2, proxy: false, env: 'development' }, originalUrl: '/', req: '<original node req>', res: '<original node res>', socket: '<original node socket>' } [2025-06-01T12:08:22.177] [30344] [INFO] - GET / 500 11ms Error: ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client at Handshake.Sequence._packetToError (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\protocol\sequences\Sequence.js:47:14) at Handshake.ErrorPacket (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\protocol\sequences\Handshake.js:123:18) at Protocol._parsePacket (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\protocol\Protocol.js:291:23) at Parser._parsePacket (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\protocol\Parser.js:433:10) at Parser.write (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\protocol\Parser.js:43:10) at Protocol.write (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\protocol\Protocol.js:38:16) at Socket.<anonymous> (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\Connection.js:88:28) at Socket.<anonymous> (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\Connection.js:526:10) at Socket.emit (node:events:507:28) at addChunk (node:internal/streams/readable:559:12) -------------------- at Protocol._enqueue (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\protocol\Protocol.js:144:48) at Protocol.handshake (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\protocol\Protocol.js:51:23) at PoolConnection.connect (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\Connection.js:116:18) at Pool.getConnection (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\Pool.js:48:16) at F:\vue3new\Ch-08\shop-backend\node_modules\think-helper\index.js:83:10 at new Promise (<anonymous>) at F:\vue3new\Ch-08\shop-backend\node_modules\think-helper\index.js:82:12 at ThinkMysql.getConnection (F:\vue3new\Ch-08\shop-backend\node_modules\think-mysql\index.js:89:69) at F:\vue3new\Ch-08\shop-backend\node_modules\think-mysql\index.js:229:21 at F:\vue3new\Ch-08\shop-backend\node_modules\think-debounce\index.js:19:16 { code: 'ER_NOT_SUPPORTED_AUTH_MODE', errno: 1251, sqlMessage: 'Client does not support authentication protocol requested by server; consider upgrading MySQL client', sqlState: '08004', fatal: true } { request: { method: 'GET', url: '/', header: { host: '127.0.0.1:8360', connection: 'keep-alive', 'cache-control': 'max-age=0', 'sec-ch-ua': '"Microsoft Edge";v="137", "Chromium";v="137", "Not/A)Brand";v="24"', 'sec-ch-ua-mobile': '?0', 'sec-ch-ua-platform': '"Windows"', 'upgrade-insecure-requests': '1', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36 Edg/137.0.0.0', accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7', 'sec-fetch-site': 'none', 'sec-fetch-mode': 'navigate', 'sec-fetch-user': '?1', 'sec-fetch-dest': 'document', 'accept-encoding': 'gzip, deflate, br, zstd', 'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6' } }, response: { status: 200, message: 'OK', header: [Object: null prototype] { 'x-powered-by': 'thinkjs-3.2.15' } }, app: { subdomainOffset: 2, proxy: false, env: 'development' }, originalUrl: '/', req: '<original node req>', res: '<original node res>', socket: '<original node socket>' } [2025-06-01T12:12:46.861] [30344] [INFO] - GET / 500 7ms Error: ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client at Handshake.Sequence._packetToError (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\protocol\sequences\Sequence.js:47:14) at Handshake.ErrorPacket (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\protocol\sequences\Handshake.js:123:18) at Protocol._parsePacket (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\protocol\Protocol.js:291:23) at Parser._parsePacket (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\protocol\Parser.js:433:10) at Parser.write (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\protocol\Parser.js:43:10) at Protocol.write (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\protocol\Protocol.js:38:16) at Socket.<anonymous> (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\Connection.js:88:28) at Socket.<anonymous> (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\Connection.js:526:10) at Socket.emit (node:events:507:28) at addChunk (node:internal/streams/readable:559:12) -------------------- at Protocol._enqueue (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\protocol\Protocol.js:144:48) at Protocol.handshake (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\protocol\Protocol.js:51:23) at PoolConnection.connect (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\Connection.js:116:18) at Pool.getConnection (F:\vue3new\Ch-08\shop-backend\node_modules\mysql\lib\Pool.js:48:16) at F:\vue3new\Ch-08\shop-backend\node_modules\think-helper\index.js:83:10 at new Promise (<anonymous>) at F:\vue3new\Ch-08\shop-backend\node_modules\think-helper\index.js:82:12 at ThinkMysql.getConnection (F:\vue3new\Ch-08\shop-backend\node_modules\think-mysql\index.js:89:69) at F:\vue3new\Ch-08\shop-backend\node_modules\think-mysql\index.js:229:21 at F:\vue3new\Ch-08\shop-backend\node_modules\think-debounce\index.js:19:16 { code: 'ER_NOT_SUPPORTED_AUTH_MODE', errno: 1251, sqlMessage: 'Client does not support authentication protocol requested by server; consider upgrading MySQL client', sqlState: '08004', fatal: true } { request: { method: 'GET', url: '/', header: { host: '127.0.0.1:8360', connection: 'keep-alive', 'cache-control': 'max-age=0', 'sec-ch-ua': '"Microsoft Edge";v="137", "Chromium";v="137", "Not/A)Brand";v="24"', 'sec-ch-ua-mobile': '?0', 'sec-ch-ua-platform': '"Windows"', 'upgrade-insecure-requests': '1', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36 Edg/137.0.0.0', accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7', 'sec-fetch-site': 'none', 'sec-fetch-mode': 'navigate', 'sec-fetch-user': '?1', 'sec-fetch-dest': 'document', 'accept-encoding': 'gzip, deflate, br, zstd', 'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6' } }, response: { status: 200, message: 'OK', header: [Object: null prototype] { 'x-powered-by': 'thinkjs-3.2.15' } }, app: { subdomainOffset: 2, proxy: false, env: 'development' }, originalUrl: '/', req: '<original node req>', res: '<original node res>', socket: '<original node socket>' } [2025-06-01T12:12:47.470] [30344] [INFO] - GET / 500 9ms
06-02
<think>好的,我现在需要解决用户遇到的MySQL客户端认证协议不支持的ER_NOT_SUPPORTED_AUTH_MODE错误。用户提到错误信息是客户端不支持服务器请求的身份验证协议,建议升级MySQL客户端。根据用户提供的引用内容,这个问题通常发生在MySQL8.0及以上版本,因为默认使用了新的认证插件caching_sha2_password,而旧版本的客户端可能不支持这个插件,导致连接失败。首先,我需要确认这个问题的根本原因。根据引用[1]和[3],当数据库升级后,旧系统可能无法兼容新的认证协议。用户可能在使用旧版本的MySQL客户端或驱动程序,比如Node.js的mysql模块,或者Python的旧版连接器。这时候,服务器要求使用新的认证方式,但客户端无法支持,所以报错。接下来,解决方案应该围绕如何让客户端和服务器在认证协议上达成一致。根据引用[5],可能的解决方式有两种:要么降低客户端的MySQL版本,要么修改服务器的认证方法为旧的mysql_native_password。不过,降低客户端版本可能不现实,尤其是在生产环境中。因此,更可行的办法是修改MySQL服务器的用户认证方式。用户可能希望保留MySQL8.0的新特性,同时兼容旧客户端。这时候,可以修改特定用户的认证插件为mysql_native_password。引用[4]中提到,可以通过执行ALTER USER命令来更改用户的认证插件。例如,使用MySQL命令行工具执行:ALTER USER'username'@'localhost' IDENTIFIEDWITH mysql_native_password BY'password'; 这会将指定用户的认证方式改为旧版,从而允许旧客户端连接。另外,引用[5]还提到,如果用户不想更改全局设置,可以临时调整。但需要注意,修改认证方式可能会降低安全性,因为mysql_native_password不如caching_sha2_password安全。因此,用户需要权衡安全性和兼容性。 此外,用户可能在使用某些编程语言连接MySQL,比如Node.js。在Node.js中,如果使用mysql模块,可能需要升级到支持新认证协议的版本,或者使用mysql2模块,后者支持caching_sha2_password。引用[2]和[4]指出,更新依赖或更换模块可能解决问题。例如,将npm的mysql包替换为mysql2,或者在连接配置中指定认证插件。总结可能的解决步骤:1.修改MySQL用户的认证插件为mysql_native_password。2.升级客户端库或驱动程序到支持新认证协议的版本。 3.在连接字符串中指定使用旧版认证插件(如果客户端支持)。需要具体指导用户执行这些步骤,例如提供具体的SQL命令,或者修改代码中的连接配置。同时,提醒用户注意安全风险,如果可能的话,建议升级客户端而不是降级服务器设置。最后,生成相关问题,帮助用户深入理解可能相关的其他问题,比如如何升级MySQL客户端,或者如何检查当前使用的认证插件等。</think>### 解决方案:ER_NOT_SUPPORTED_AUTH_MODE 错误 #### 问题原因 MySQL 8.0+ 默认使用新的身份验证插件 `caching_sha2_password`,而旧版客户端(如 Node.js 的 `mysql` 模块、Python 的 `mysql-connector` 旧版本)仅支持旧版插件 `mysql_native_password`,导致连接失败[^1][^3][^5]。 --- #### 分步解决方法 ##### 方法 1:修改用户认证方式(推荐临时方案) 1. **登录 MySQL 服务器**: ```bash mysql -u root -p ``` 2. **执行修改命令**: ```sql ALTER USER '用户名'@'localhost' IDENTIFIED WITH mysql_native_password BY '新密码'; ``` 例如: ```sql ALTER USER 'app_user'@'%' IDENTIFIED WITH mysql_native_password BY 'Passw0rd!'; ``` 3. **刷新权限**: ```sql FLUSH PRIVILEGES; ``` **注意**:此方法会降低安全性,建议仅用于过渡期[^4][^5]。 ##### 方法 2:全局修改默认认证插件(适合长期兼容) 1. **编辑 MySQL 配置文件**(如 `my.cnf` 或 `my.ini`): ```ini [mysqld] default_authentication_plugin=mysql_native_password ``` 2. **重启 MySQL 服务**: ```bash systemctl restart mysql # Linux ``` 或通过服务管理器重启 Windows 的 MySQL 服务。 ##### 方法 3:升级客户端库 - **Node.js**:将 `mysql` 模块替换为支持新协议的 `mysql2`: ```bash npm uninstall mysql && npm install mysql2 ``` - **Python**:升级 `mysql-connector-python`: ```bash pip install mysql-connector-python --upgrade ``` - **其他语言**:检查官方文档是否支持 `caching_sha2_password`[^2][^4]。 --- #### 验证是否解决 - **测试连接**: ```python # Python 示例 import mysql.connector conn = mysql.connector.connect( host="localhost", user="app_user", password="Passw0rd!", database="test_db" ) print("连接成功!") ``` --- ### 相关问题 1. **如何检查 MySQL 用户的当前认证插件?** ```sql SELECT user, plugin FROM mysql.user; ``` 2. **为什么 `caching_sha2_password` 更安全?** 它使用 SHA-256 加密密码,且支持缓存机制防止重放攻击[^1][^5]。 3. **升级 MySQL 客户端后仍报错怎么办?** 检查连接配置中是否显式指定了旧插件(如 `auth_plugin=mysql_native_password`)。 --- **安全建议**:长期解决方案应升级客户端库而非降级认证协议,以保持安全性[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值