【问题标题】:Node.js strange behaviour (perhaps module memory limit) on OS XOS X 上的 Node.js 奇怪行为(可能是模块内存限制)
【发布时间】:2026-01-27 07:25:01
【问题描述】:

我正在 OS X 上使用 Node.js 开发应用程序,并且正在使用很多库(AWS、express、redis、Sequelize with pgSQL...)。我最近添加了使用 leveldb 的新模块(我通过 'level' 包安装了它)。模块看起来像:

var levelup = require('level');

function init(config) {
    return levelup(config.level_db, {keyEncoding: 'json', valueEncoding: 'json'});
}

module.exports = {
    init: init
};

如果我在主“server.js”文件中需要它,一切正常。但是当我想将调用'init'的结果分配给某个变量时,运行代码返回:

192:qubie garretraziel$ node server.js 

undefined:0


TypeError: undefined is not a function
192:qubie garretraziel$

我很确定这不是某种语法错误,因为相同的代码在我的 Linux 机器上运行没有问题。如果我删除一些随机的 'require('library');' (使用适当的代码)它再次失败但后来(它开始侦听端口,但随后失败):

192:qubie garretraziel$ node server.js 
App is running on port 8080

undefined:0


TypeError: undefined is not a function
192:qubie garretraziel$

当我删除足够多的“要求”时,代码就可以工作了。如果我从模块中“提取”代码并直接在 server.js 中执行“var db = levelup(config...)”,则它可以毫无问题地运行。我尝试重新安装所有模块,重新安装 Node.js 并使用 NVM 安装不同的版本,但没有任何帮助。模块可以使用多少内存或类似的东西是否有某种限制?奇怪的是,在我的 Linux 机器上它可以正常工作(并且使用 50 到 100 MB 的 RAM)。

编辑: 我的 server.js 文件如下所示:

var http = require('http');
var https = require('https');
var express = require('express');
var session = require('express-session');
var RedisStore = require('connect-redis')(session);
var winston = require('winston');

var configuration = require('./configuration/configuration');
var setup = require('./lib/setup');
var bc11m = require('./lib/bc11n');
var memdb = require('./lib/memdb');
var drawdb = require('./lib/drawdb');
var models = require('./models');

var app = express();
var config = configuration[app.get('env')];
var db = models(config);
var memstore = memdb.init(config);
var drawstore = drawdb.init(config);
var server;

function runServer() {
    var sessionStore = new RedisStore({client: memstore});

    setup.settings(app, config, db, sessionStore);
    setup.routes(app, config, db, memstore);

    if (config.ssl) {
        server = https.createServer(config.options, app);
    } else {
        server = http.createServer(app);
    }

    bc11m.init(server, config, db, memstore, sessionStore, drawstore);

    server.listen(config.port, function () {
        console.log("App is running on port " + config.port);
    });
}

db.sequelize.sync().complete(function (err) {
    if (err) {
        winston.error('during syncing database: %s', String(err))
    } else {
        runServer();
    }
});

那个升级模块叫做drawdb.js。此代码失败,但当我这样做时:

var drawstore = levelup(config...

它有效。或者当我删除 'require('./lib/bc11n')' 和 'require('./models')' 以及其他很少的要求时,它也可以工作。

【问题讨论】:

  • 好吧,server.js 是什么样的?第一个模块的名称是什么?
  • 我已经用 'server.js' 代码更新了问题。
  • 所以,我注意到 LevelUP 并未将 Mac 列为支持/测试的平台:github.com/rvagg/node-levelup
  • “测试和支持的平台”中有“Mac OS”...
  • @GarretRaziel 已列出,但没有关于版本等的注释,所以这让我觉得它实际上并没有得到支持和测试。

标签: javascript node.js macos memory


【解决方案1】:

根据this issue 的说法,使用 OS X 的其他人也遇到了同样的问题。让level 使用最新版本的leveldown(撰写本文时为1.0.0)似乎可以解决问题。显然有一些兼容性问题阻止了level 更新到更新版本的leveldown,所以你现在在 OS X 上可能不走运。

【讨论】:

  • 是的,就是这样!谢谢你。由于“TypeError: undefined”是一种非常广泛的错误类型,并且删除了足够多的要求阻止了它,我认为leveldown 不是问题。