Nodejs symbol lookup error

Nodejs symbol lookup error

ok,就像标题说的,我在做《一起学nodejs》第一章的时候,安装了mongo,及connect-mongo,并切本地已经启动了mongodb。然后按照教程在app.js中做如下操作:

var MongoStore = require('connect-mongo')(express);
var settings = require('./settings');

然后试着重启服务:

npm start

结果出现了异常:

node: symbol lookup error: /home/naitnix/workspace/NodePro/blog/node_modules/connect-mongo/node_modules/mongodb/node_modules/bson/build/Release/bson.node: undefined symbol: _ZN2v86Object8ForceSetENS_6HandleINS_5ValueEEES3_NS_17PropertyAttributeE

于是,我试着排查问题的出处,所以将

var settings = require('./settings');

注释掉,错误依然存在,所以基本上确定是这个connect-mongo的原因导致的。网上查了很多的详细问题,无解,遂来社区讨教。

另外我的本地环境:

npm ERR! System Linux 3.2.0-38-generic
npm ERR! command "/home/naitnix/.nvm/v0.11.10/bin/node" "/home/naitnix/.nvm/v0.11.10/bin/npm" "start"
npm ERR! cwd /home/naitnix/workspace/NodePro/blog
npm ERR! node -v v0.11.10
npm ERR! npm -v 1.3.22
npm ERR! code ELIFECYCLE

express 版本:

express -V
# => 3.0.0

4 回复

在处理 Node.js 中的 symbol lookup error 时,通常是因为某个模块的二进制文件(如 C++ 扩展)与当前运行的 Node.js 版本不兼容。具体到你遇到的问题,错误信息表明在加载 bson.node 文件时遇到了一个未定义的符号。

分析原因

从错误信息来看,问题出在 connect-mongo 模块依赖的 mongodb 模块中的 bson 模块。这个错误通常发生在以下几种情况:

  1. Node.js 版本不匹配:你使用的是 Node.js 的开发版本(v0.11.10),而某些库可能没有为这个版本进行编译。
  2. 库的版本不兼容:你使用的 connect-mongomongodb 版本可能与当前 Node.js 版本不兼容。
  3. 编译问题:某些库可能需要重新编译以确保与当前 Node.js 版本兼容。

解决方案

1. 切换到稳定版 Node.js

首先,尝试切换到 Node.js 的稳定版本,比如 LTS 版本。你可以使用 nvm(Node Version Manager)来管理 Node.js 版本:

# 安装 nvm
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash

# 使用 nvm 安装最新 LTS 版本
nvm install --lts
nvm use --lts

2. 更新依赖库

确保所有依赖库都是最新的,并且与你的 Node.js 版本兼容:

npm install express@latest
npm install connect-mongo@latest
npm install mongodb@latest

3. 清理并重建依赖

有时,清理 node_modules 目录并重新安装依赖可以解决一些问题:

rm -rf node_modules
npm cache clean --force
npm install

4. 重新编译二进制文件

如果上述方法无效,你可能需要手动编译有问题的二进制文件。这通常涉及重新安装相关的库:

npm rebuild bson

示例代码

假设你已经解决了上述问题,你的 app.js 可能看起来像这样:

var express = require('express');
var MongoStore = require('connect-mongo')(express);
var settings = require('./settings');

var app = express();

// 配置中间件和路由
app.use(express.session({
    secret: settings.cookieSecret,
    key: settings.db, // cookie name
    store: new MongoStore({
        url: 'mongodb://localhost/' + settings.db
    })
}));

app.get('/', function(req, res) {
    res.send('Hello World!');
});

app.listen(3000, function() {
    console.log('Server running on port 3000');
});

总结

通过以上步骤,你应该能够解决 symbol lookup error 问题。主要关注点在于确保 Node.js 版本与依赖库兼容,并正确地重新编译或更新相关库。


请问一下,这个问题你是怎么解决的。

我切换了node版本之后就可以了,但是不知道什么原因。望大神指点一下。

你遇到的 symbol lookup error 通常是由于不同版本的库之间的兼容性问题引起的。具体来说,这个问题可能是由于 Node.js 的 ABI(应用程序二进制接口)不兼容导致的。

以下是一些可能的解决方案:

解决方案 1: 卸载并重新安装依赖包

尝试卸载并重新安装 connect-mongomongodb 包,确保它们与当前的 Node.js 版本兼容。

npm uninstall connect-mongo mongodb
npm install connect-mongo@latest mongodb@latest

解决方案 2: 使用稳定的 LTS 版本

你的 Node.js 版本是 v0.11.10,这是一个非常旧且不稳定的版本。建议使用一个长期支持(LTS)版本,例如 v14.xv16.x

nvm install --lts
nvm use --lts

示例代码

确保你的 app.js 文件看起来像这样:

var express = require('express');
var MongoStore = require('connect-mongo')(express);
var settings = require('./settings');

var app = express();
app.use(express.session({
    secret: settings.cookieSecret,
    store: new MongoStore({ url: settings.db })
}));

// 其他路由和中间件

总结

  • 确保所有依赖包是最新的。
  • 尝试使用稳定版的 Node.js。
  • 如果问题仍然存在,请检查你的系统库是否与 Node.js 版本兼容。

如果上述方法仍不能解决问题,可能需要进一步检查系统环境或查看是否有其他特定于系统的配置问题。

回到顶部