MariaDB node.js 脚本在尝试将数据从本地 XML 文件加载到表中时抛出 ER_LOCAL_INFILE_WRONG_FILENAME 错误
Posted
技术标签:
【中文标题】MariaDB node.js 脚本在尝试将数据从本地 XML 文件加载到表中时抛出 ER_LOCAL_INFILE_WRONG_FILENAME 错误【英文标题】:MariaDB node.js script throws ER_LOCAL_INFILE_WRONG_FILENAME error when trying to load data into table from local XML file 【发布时间】:2022-01-02 04:23:18 【问题描述】:我有一个 node.js 脚本,它连接到本地 MariaDB 服务器,创建一些表,然后尝试通过执行如下 SQL 查询将一些数据加载到其中:
LOAD XML LOCAL INFILE 'C:\\path\\to\\some_data.xml'
INTO TABLE some_data
ROWS IDENTIFIED BY '<data>';
脚本失败并出现如下错误:
SqlError: (conn=60, no: 45034, SQLState: 45034) LOCAL INFILE wrong filename. 'C:\path\to\some_data.xml' doesn't correspond to query LOAD XML LOCAL INFILE 'C:\\path\\to\\some_data.xml'
INTO TABLE some_data
ROWS IDENTIFIED BY '<data>';. Query cancelled. Check for malicious server / proxy
node.js 脚本代码如下:
const pathToXmlFile = path.resolve(__dirname, '../some_data.xml')
.replace(/\\/g, '\\\\');
// .replace(/\\/g, '/');
// none of the above work, and neither does no escaping at all
query = `LOAD XML LOCAL INFILE '$pathToXmlFile'
INTO TABLE some_data
ROWS IDENTIFIED BY '<data>';`;
我尝试使用正斜杠转义路径(我正在通过 Git Bash 运行脚本),但错误仍然存在,只是路径的显示方式发生了变化。我在 MariaDB 客户端连接上设置了permitLocalInfile: 'true'
,在my.ini
的[mysqld]
和[client]
部分设置了local_infile=1
。 node.js 连接用户拥有 FILE 权限。
节点版本为 16.13.0,MariaDB npm 模块版本为 2.5.5,都运行在与 Windows 10 相同的机器上(MariaDB 服务器也在本地主机上)。
上述查询在从 HeidiSQL 执行时运行良好。
关于我做错了什么有什么想法吗?
【问题讨论】:
这似乎是一个字符串转义问题。你能提供你用来测试这个的 Node.js 代码吗?如果实际代码可用,那将有很大帮助。 我添加了一个代码sn-p。正如我所写,我想我尝试了所有可能的字符串转义组合,但也许我错过了一些东西。 【参考方案1】:我为此创建了一个 mariadb 错误:https://jira.mariadb.org/browse/CONJS-181
作为一种解决方法,您可以使用“/”代替“\”:使用“C:/path/to/some_data.xml”将不会被转义以避免此错误
【讨论】:
谢谢!正如我在描述中所写,我尝试以所有可能的方式转义路径,包括您建议的正斜杠(unix 样式)。这两种方式都不起作用? 经过仔细调查,该错误(如果有)似乎与 mariadb 的 npm 模块有关,而不是 mariadb 本身。所以你可能应该关闭它。 github.com/mariadb-corporation/mariadb-connector-nodejs/blob/… 这是测试有效性的特殊方法。我正在研究它,做一些测试。 github.com/mariadb-corporation/mariadb-connector-nodejs/blob/… 我已经提交了一个关于 node.js 连接器的新问题,请关闭上面的一个:github.com/mariadb-corporation/mariadb-connector-nodejs/issues/…【参考方案2】:这似乎是mariadb
节点连接器的错误,我在这里打开了一个问题:
https://github.com/mariadb-corporation/mariadb-connector-nodejs/issues/183
与此同时,我尝试了mysql2
和mysql
连接器,第一个似乎不支持permitLocalInfile: 'true'
连接选项,所以我切换到标准mysql
连接器并且一切正常(由于方法调用的细微差别,对代码进行了一些更改)。
如果mariadb
连接器中的错误已修复,我将在此处更新答案。
【讨论】:
以上是关于MariaDB node.js 脚本在尝试将数据从本地 XML 文件加载到表中时抛出 ER_LOCAL_INFILE_WRONG_FILENAME 错误的主要内容,如果未能解决你的问题,请参考以下文章