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;
根据你提供的错误信息和代码片段,问题主要出在 session
中间件的使用上。从错误信息来看,express-session
库已经不再包含在 Express 的默认依赖中,需要单独安装。此外,connect-mongo
也可能是导致问题的原因。
解决步骤:
-
安装必要的依赖: 确保你已经安装了
express-session
和connect-mongo
。如果没有安装,可以通过以下命令进行安装:npm install express-session connect-mongo
-
更新
connect-mongo
的导入路径:connect-mongo
的导入路径可能需要更新,以匹配最新的库版本。假设你使用的是较新的版本,可以尝试以下方式导入:const MongoStore = require('connect-mongo').default;
-
修改
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)
根据你提供的错误信息,问题出在两个地方:
-
缺少
connect-mongo
依赖: 错误信息中提到session
需要安装connect-mongo
。你需要安装connect-mongo
库来支持 MongoDB 作为 session 存储。npm install connect-mongo --save
-
使用过时的
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
运行时报错的问题。