Nodejs 使用node.js连接mysql数据库,提示dyld: Symbol not found: _mysql_init

Nodejs 使用node.js连接mysql数据库,提示dyld: Symbol not found: _mysql_init

node:0.6.17

mysql:5.5.21

os:lion 10.7.3

var
  //sys = require('sys'),
  mysql = require('/Users/mackjoner/tech/nodejs/node_modules/mysql-libmysqlclient'),
  conn,
  result,
  row,
  rows;

var host = “localhost”, user = “test”, password = “password”, database = “db”, test_table = “users”;

conn = mysql.createConnectionSync(); conn.connectSync(host, user, password, database);

//sys.puts(“Information:”); //sys.puts(sys.inspect(conn.getInfoSync()) + “\n”);

if (!conn.connectedSync()) { //sys.puts("Connection error " + conn.connectErrno + ": " + conn.connectError); console.log("Connection error " + conn.connectErrno + ": " + conn.connectError); process.exit(1); }

conn.query("SELECT * FROM " + test_table + “;”, function (err, res) { if (err) { throw err; }

res.fetchAll(function (err, rows) { if (err) { throw err; }

//sys.puts("Rows in table '" + database + "." + test_table + "':");
//sys.puts(sys.inspect(rows));
console.log("Rows in table '" + database + "." + test_table + "':");

// This isn't necessary since v1.2.0
// See https://github.com/Sannis/node-mysql-libmysqlclient/issues#issue/60
//res.freeSync();

}); });

process.on(‘exit’, function () { conn.closeSync(); });

提示信息

dyld: lazy symbol binding failed: Symbol not found: _mysql_init
  Referenced from: /Users/yangzhaojie/tech/nodejs/node_modules/mysql-libmysqlclient/build/Release/mysql_bindings.node
  Expected in: flat namespace

dyld: Symbol not found: _mysql_init
  Referenced from: /Users/yangzhaojie/tech/nodejs/node_modules/mysql-libmysqlclient/build/Release/mysql_bindings.node
  Expected in: flat namespace

9 回复

您遇到的错误 dyld: Symbol not found: _mysql_init 通常是由于安装的 MySQL 驱动与当前使用的 Node.js 版本或操作系统不兼容导致的。在您的情况下,使用的是较旧版本的 Node.js(0.6.17)和 MySQL(5.5.21),这可能会导致一些兼容性问题。

解决方案

为了修复这个问题,您可以尝试以下几个步骤:

  1. 升级 Node.js 和 npm:使用更现代的 Node.js 版本(如 14.x 或更高版本),因为这些版本对库的支持更好。
  2. 重新安装 MySQL 驱动:确保您安装了正确版本的 MySQL 驱动。

示例代码和步骤

步骤 1: 升级 Node.js 和 npm

您可以从 Node.js 官网下载最新版本的 Node.js 安装包并进行安装。

步骤 2: 安装正确的 MySQL 驱动

您可以使用 mysql2sequelize 等更现代的驱动来替代 mysql-libmysqlclient

npm uninstall mysql-libmysqlclient
npm install mysql2

示例代码

以下是使用 mysql2 连接 MySQL 数据库的示例代码:

const mysql = require('mysql2/promise');

async function connectAndQuery() {
  try {
    const connection = await mysql.createConnection({
      host: 'localhost',
      user: 'test',
      password: 'password',
      database: 'db'
    });

    console.log('Connected to MySQL database!');

    const [rows] = await connection.execute('SELECT * FROM users;');

    console.log('Rows in table `users`:');
    console.log(rows);
  } catch (error) {
    console.error('Error connecting to the database:', error);
  }
}

connectAndQuery();

解释

  • mysql.createConnection: 创建一个新的数据库连接。
  • connection.execute: 执行 SQL 查询并获取结果。
  • [rows]: 解构赋值以获取查询结果。
  • console.log: 输出查询结果到控制台。

通过这种方式,您可以避免使用过时的驱动程序,并且更容易获得支持和更新。希望这对您有所帮助!


markup

配置环境变量

export DYLD_LIBRARY_PATH=/usr/local/mysql/lib/

搜了一下, 很多人都碰上这个问题啊, 共同点是: MacOS X 系统上安装MySQL

一下为原文: 大概意思是,你可能装了跟CPU的bit不一致的MySQL版本. 比如你的Mac是64-bit的,你却装了一个32-bit的MySQL… 希望能给你一点帮助… Hi,

Sorry to hear you’re having troubles, but from a quick google it seems like you’re not the only one: http://www.perlmonks.org/?node_id=793727 http://stackoverflow.com/questions/13342…ow-leopard

The general problem seems to be a 32-bit / 64-bit mismatch between MySQL and Perl…

Okay, as you’re installing the 10.6 package of MySQL i’m guessing you’re on Snow Leopard? Does your mac have a 64-bit processor in it (see here for details)?

Then, once you have established whether you should be running 32-bit or 64-bit code (match to your processor), completely remove MySQL from your system, install the appropriate one (I’m guessing you’ll probably need the 64-bit one), then reinstall DBD::MySQL.

Let me know how you get on.

是的,问题就是这个mysql32和64的区别,要和cpu对应。 设置环境变量是 Error: Unable to load shared library 解决这个错误

人类已经无法阻止cnodejs被XSS了!

这个是因为mysql需要的一些库没有在正确的位置, 一楼给的方案可以解决该问题, 最完美的方案是将需要的库安装到指定位置

这个问题通常是由于 MySQL C API 库没有正确安装或者路径配置不正确导致的。解决方法可以从以下几个方面入手:

  1. 安装MySQL C API库: 确保你的系统上安装了 MySQL C API 库。你可以通过 Homebrew 来安装:

    brew install mysql
    
  2. 确保模块正确安装: 确认你已经正确安装了 mysql 模块。可以使用 npm 安装一个常见的 MySQL 驱动 mysql 而不是 mysql-libmysqlclient

    npm install mysql
    
  3. 检查环境变量: 确保你的环境变量中包含了 MySQL 的库路径。

  4. 修改代码: 修改你的代码以使用 mysql 模块,这是一个更现代、维护更好的驱动:

    const mysql = require('mysql');
    
    const connection = mysql.createConnection({
      host: 'localhost',
      user: 'test',
      password: 'password',
      database: 'db'
    });
    
    connection.connect((err) => {
      if (err) {
        console.error('Error connecting to MySQL:', err.stack);
        return;
      }
      console.log('Connected to MySQL as id ' + connection.threadId);
    });
    
    connection.query('SELECT * FROM users;', (error, results, fields) => {
      if (error) throw error;
      console.log('Results:', results);
    });
    
    connection.end();
    

总结来说,你应该避免使用 mysql-libmysqlclient 这个不再维护的模块,而选择 mysql 模块,并确保相关的依赖项已正确安装和配置。

回到顶部