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

与此同时,我尝试了mysql2mysql 连接器,第一个似乎不支持permitLocalInfile: 'true' 连接选项,所以我切换到标准mysql 连接器并且一切正常(由于方法调用的细微差别,对代码进行了一些更改)。

如果mariadb 连接器中的错误已修复,我将在此处更新答案。

【讨论】:

以上是关于MariaDB node.js 脚本在尝试将数据从本地 XML 文件加载到表中时抛出 ER_LOCAL_INFILE_WRONG_FILENAME 错误的主要内容,如果未能解决你的问题,请参考以下文章

从 Node.js POST 到 PHP

Node.js:如何将 JS 变量值从脚本传递到终端?

如何从 node.js 中的 postgresql 脚本中读取

尝试从 html 表单和 Node.js 发送数据

是否可以使用 node.js 从 URL 导入脚本?

与 MySQL 合作多年的 Perl 脚本在升级到 MariaDB 后不再有效