Nodejs app.js运行报错

Nodejs app.js运行报错

Failed to load c++ bson extension, using pure JS version

/home/justhacker/tools/codes/microblog/node_modules/express/lib/express.js:89 throw new Error('Most middleware (like ’ + name + ') is no longer bundle ^ Error: Most middleware (like session) is no longer bundled with Express and must be installed separately. Please see https://github.com/senchalabs/connect#middleware.

at Function.Object.defineProperty.get (/home/justhacker/tools/codes/microblog/node_modules/express/lib/express.js:89:13) at module.exports (/home/justhacker/tools/codes/microblog/node_modules/connect-mongo/lib/connect-mongo.js:30:22) at Object. (/home/justhacker/tools/codes/microblog/app.js:14:42) at Module._compile (module.js:449:26) at Object.Module._extensions…js (module.js:467:10) at Module.load (module.js:349:32) at Function.Module._load (module.js:305:12) at Function.Module.runMain (module.js:490:10) at startup (node.js:124:16) at node.js:807:3

官方文档。

Middleware

As of 4.x, Express no longer depends on Connect. All of Express’ previously included middleware are now in separate repos. Please view the list of middleware. The only included middleware is now express.static().

但是我的代码里面没有用。

var express = require('express');
var path = require('path');
var favicon = require('static-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var session = require('express-session');
var bodyParser = require('body-parser');

var util = require(‘util’);

var routes = require(’./routes/index’); var users = require(’./routes/users’); //var connect = require(‘connect’); var MongoStore = require(‘connect-mongodb’); var setting = require(’./setting’);

var app = express();

// view engine setup app.set(‘views’, path.join(__dirname, ‘views’)); app.set(‘view engine’, ‘ejs’);

app.use(favicon()); app.use(logger(‘dev’)); app.use(bodyParser.json()); app.use(bodyParser.urlencoded()); //app.use(express.methodOverride()); app.use(cookieParser()); app.use(session({ secret: setting.cookieSecret, store: new MongoStore({ db: setting.db }) })); app.use(express.static(path.join(__dirname, ‘public’)));

app.use(’/’, routes); app.use(’/users’, users);

/// catch 404 and forwarding to error handler app.use(function(req, res, next) { var err = new Error(‘Not Found’); err.status = 404; next(err); });

/// error handlers

// development error handler // will print stacktrace if (app.get(‘env’) === ‘development’) { app.use(function(err, req, res, next) { res.status(err.status || 500); res.render(‘error’, { message: err.message, error: err }); }); }

// production error handler // no stacktraces leaked to user app.use(function(err, req, res, next) { res.status(err.status || 500); res.render(‘error’, { message: err.message, error: {} }); });

module.exports = app;


5 回复

根据你提供的错误信息和代码片段,问题主要出在 session 中间件的使用上。从错误信息来看,express-session 库已经不再包含在 Express 的默认依赖中,需要单独安装。此外,connect-mongo 也可能是导致问题的原因。

解决步骤:

  1. 安装必要的依赖: 确保你已经安装了 express-sessionconnect-mongo。如果没有安装,可以通过以下命令进行安装:

    npm install express-session connect-mongo
    
  2. 更新 connect-mongo 的导入路径connect-mongo 的导入路径可能需要更新,以匹配最新的库版本。假设你使用的是较新的版本,可以尝试以下方式导入:

    const MongoStore = require('connect-mongo').default;
    
  3. 修改 session 配置: 确保你的 session 配置正确。以下是一个示例配置:

    var express = require('express');
    var path = require('path');
    var favicon = require('static-favicon');
    var logger = require('morgan');
    var cookieParser = require('cookie-parser');
    var bodyParser = require('body-parser');
    var session = require('express-session');
    var MongoStore = require('connect-mongo').default;
    
    var app = express();
    
    // view engine setup
    app.set('views', path.join(__dirname, 'views'));
    app.set('view engine', 'ejs');
    
    app.use(favicon());
    app.use(logger('dev'));
    app.use(bodyParser.json());
    app.use(bodyParser.urlencoded({ extended: false }));
    app.use(cookieParser());
    app.use(session({
      secret: 'your-secret-key',
      resave: false,
      saveUninitialized: false,
      store: new MongoStore({
        url: 'mongodb://localhost:27017/your-db-name'
      })
    }));
    app.use(express.static(path.join(__dirname, 'public')));
    
    app.use('/', require('./routes/index'));
    app.use('/users', require('./routes/users'));
    
    // catch 404 and forward to error handler
    app.use(function(req, res, next) {
      var err = new Error('Not Found');
      err.status = 404;
      next(err);
    });
    
    // error handlers
    
    // development error handler
    if (app.get('env') === 'development') {
      app.use(function(err, req, res, next) {
        res.status(err.status || 500);
        res.render('error', {
          message: err.message,
          error: err
        });
      });
    }
    
    // production error handler
    app.use(function(err, req, res, next) {
      res.status(err.status || 500);
      res.render('error', {
        message: err.message,
        error: {}
      });
    });
    
    module.exports = app;
    

总结:

确保你已经安装了所有必要的依赖,并且正确配置了 session 中间件。如果问题仍然存在,建议检查 MongoDB 是否正常运行,并确认连接字符串是否正确。


没有看到监听端口写在哪

帮楼主格式化了一遍代码… 话说报错的是 14 行是被注释掉的那行代码吗?

at Object. (/home/justhacker/tools/codes/microblog/app.js:14:42

已经解决了。。 Failed to load c++ bson extension, using pure JS version

现在报这个错误。。

界面上显示 Cannot read property ‘findOne’ of null

undefined

TypeError: Cannot read property ‘findOne’ of null at MongoStore.MONGOSTORE.get (/home/justhacker/tools/codes/microblog/node_modules/connect-mongodb/lib/connect-mongodb.js:115:14) at Layer.session [as handle] (/home/justhacker/tools/codes/microblog/node_modules/express-session/index.js:328:11) at trim_prefix (/home/justhacker/tools/codes/microblog/node_modules/express/lib/router/index.js:226:17) at /home/justhacker/tools/codes/microblog/node_modules/express/lib/router/index.js:198:9 at Function.proto.process_params (/home/justhacker/tools/codes/microblog/node_modules/express/lib/router/index.js:251:12) at next (/home/justhacker/tools/codes/microblog/node_modules/express/lib/router/index.js:189:19) at Layer.cookieParser [as handle] (/home/justhacker/tools/codes/microblog/node_modules/cookie-parser/index.js:46:5) at trim_prefix (/home/justhacker/tools/codes/microblog/node_modules/express/lib/router/index.js:226:17) at /home/justhacker/tools/codes/microblog/node_modules/express/lib/router/index.js:198:9 at Function.proto.process_params (/home/justhacker/tools/codes/microblog/node_modules/express/lib/router/index.js:251:12)

根据你提供的错误信息,问题出在两个地方:

  1. 缺少 connect-mongo 依赖: 错误信息中提到 session 需要安装 connect-mongo。你需要安装 connect-mongo 库来支持 MongoDB 作为 session 存储。

    npm install connect-mongo --save
    
  2. 使用过时的 express-session 配置: 在 express-session 中,store 配置需要一个实例,而不是直接使用 MongoStore 类。

以下是修正后的代码示例:

var express = require('express');
var path = require('path');
var favicon = require('static-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var session = require('express-session');
var bodyParser = require('body-parser');

var MongoStore = require('connect-mongo')(session); // 修改这里
var setting = require('./setting');

var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');

app.use(favicon());
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded());
app.use(cookieParser());
app.use(session({
  secret: setting.cookieSecret,
  store: new MongoStore({ // 修改这里
    url: setting.db // 使用 `url` 而不是 `db`
  })
}));
app.use(express.static(path.join(__dirname, 'public')));

// 其他路由配置...

module.exports = app;

解释

  • connect-mongo 安装:确保安装了 connect-mongo
  • store 配置:将 store 配置为 MongoStore 的实例,而不是直接使用类。
  • url 配置:使用 url 字段指定 MongoDB 连接字符串。

通过这些修改,你应该能够解决 app.js 运行时报错的问题。

回到顶部