Nodejs TypeError: Undefined type at `paths.sid`
Nodejs TypeError: Undefined type at paths.sid
#关于标题 *这是一个报错信息; *别人发生类似错误时可快速定位,找到答案;
#我遇到什么问题?
我在使用Express + mongoose + session-mongoose
开发网站应用时,发生了错误,我的代码如下:
//数据库
var dbconfig = require('./dbconfig.js');//读取配置
var mongoose = require("mongoose");
mongoose.connect(dbconfig.mongoose_constr);//创建连接
/session支持/
app.use(express.cookieParser());
var SessionStore = require(“session-mongoose”)(express);
var _sstore = new SessionStore({
connection : mongoose.connection,
interval : 120000,
sweeper: false, //Session过期后,不清除数据
ttl: 300, //Sessuib过期时间,单位:秒
modelname: ‘SessionUser’ //mongoose model name
});
app.use(express.session({
store : _sstore,
cookie: { maxAge: 900000 }
}));
我在运行网站时,控制台报错如下:
E:\project>node app
E:\project\node_modules\mongoose\li
b\schema.js:362
throw new TypeError('Undefined type at `' + path +
^
TypeError: Undefined type at `paths.sid`
Did you try nesting Schemas? You can only nest using refs or arrays.
at Function.Schema.interpretAsType (E:\project\node_modules\mongoose\lib\schema.js:362:11)
at Schema.path (E:\project\node
_modules\mongoose\lib\schema.js:305:29)
at Schema.add (E:\project\node_
modules\mongoose\lib\schema.js:217:12)
at Schema.add (E:\project\node_
modules\mongoose\lib\schema.js:212:14)
at new Schema (E:\project\node_
modules\mongoose\lib\schema.js:73:10)
at NativeConnection.Connection.model (E:\project\node_modules\mongoose\lib\connection.js:584:14)
at new SessionStore (E:\project
\node_modules\session-mongoose\index.js:95:35)
at Object.<anonymous> (E:\project\app.js:38:15)
at Module._compile (module.js:456:26)
at Object.Module._extensions..js (module.js:474:10)
谁能告诉我这个错误改怎么解决?
另外,怎样让mongoose
的数据库连接只配置一次,就可以全局通用?我是这样做的,你们还有其他更好的方法吗?求分享~~
/*ProjectSchema.js*/
module.exports = function(mongoose){
//mongoose:从顶层传入的mongoose实例对象
var Schema = mongoose.Schema;
var ProjectSchema= {
UserSchema : new Schema({
UserName : {type: String, index: true},
PassWord : String,
IsDeleted : {type: Boolean, default: false},
CreateDate : { type: Date, default: Date.now }
},{
_id: true,
collection: 'core.User'
}),
SessionUserSchema : new Schema({
UserId : Schema.Types.ObjectId,
UserName : {type: String, index: true},
LoginTime : { type: Date, default: Date.now }
},{
_id: true,
collection: 'safe.SessionUser'
})
};
return ProjectSchema;
};
/ProjectModel.js/
module.exports = function(mongoose){
//mongoose:从顶层传入的mongoose实例对象
var prSchema = require(’./ProjectSchema.js’)(mongoose);
var ProjectModel= {
UserModel : mongoose.model('User',prSchema .UserSchema),
SessionUser : mongoose.model('SessionUser',prSchema .SessionUserSchema)
};
return ProjectModel;
}
根据你提供的代码和报错信息,错误发生在 session-mongoose
插件中,具体是在处理 sid
字段时遇到了未定义类型的问题。这通常是因为 SessionUser
模型中的字段定义不正确或缺少必要的字段。
错误分析
错误提示 TypeError: Undefined type at
paths.sid`` 表明 sid
字段在 SessionUser
模型中没有被正确地定义。这可能是由于 SessionUser
模型中的字段定义缺失或格式不正确。
解决方案
我们可以通过检查 SessionUser
模型的定义来解决问题。确保所有字段都正确定义,并且符合 Mongoose 的规范。
示例代码
首先,我们需要确保 SessionUser
模型中的字段定义正确。以下是修改后的 ProjectSchema.js
文件:
/*ProjectSchema.js*/
module.exports = function(mongoose) {
var Schema = mongoose.Schema;
var ProjectSchema = {
UserSchema: new Schema({
UserName: { type: String, index: true },
PassWord: String,
IsDeleted: { type: Boolean, default: false },
CreateDate: { type: Date, default: Date.now }
}, {
_id: true,
collection: 'core.User'
}),
SessionUserSchema: new Schema({
sid: { type: String, required: true }, // 确保 sid 字段存在
UserId: Schema.Types.ObjectId,
UserName: { type: String, index: true },
LoginTime: { type: Date, default: Date.now }
}, {
_id: true,
collection: 'safe.SessionUser'
})
};
return ProjectSchema;
};
接下来,我们需要更新 ProjectModel.js
文件以确保模型正确加载:
/*ProjectModel.js*/
module.exports = function(mongoose) {
var prSchema = require('./ProjectSchema.js')(mongoose);
var ProjectModel = {
UserModel: mongoose.model('User', prSchema.UserSchema),
SessionUser: mongoose.model('SessionUser', prSchema.SessionUserSchema)
};
return ProjectModel;
}
让 Mongoose 连接只配置一次
为了使 Mongoose 连接只配置一次并全局可用,可以将连接逻辑封装在一个单独的模块中,并在整个项目中引用该模块。例如:
/*db.js*/
const mongoose = require('mongoose');
const connectToDatabase = () => {
const dbconfig = require('./dbconfig.js');
mongoose.connect(dbconfig.mongoose_constr, { useNewUrlParser: true, useUnifiedTopology: true });
mongoose.connection.on('error', err => {
console.error(`MongoDB connection error: ${err}`);
});
mongoose.connection.once('open', () => {
console.log('Connected to MongoDB database');
});
};
module.exports = connectToDatabase;
然后在主文件中调用该函数:
/*app.js*/
const express = require('express');
const connectToDatabase = require('./db.js');
const app = express();
connectToDatabase();
// 其他中间件和路由配置
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
通过这种方式,你可以确保 Mongoose 只配置一次,并且可以在整个项目中全局使用。
根据你提供的错误信息和代码片段,错误的原因是 mongoose
在尝试解析路径 paths.sid
时遇到了未定义的类型。这通常是由于在定义 Schema 时出现了问题。
错误原因分析
在 session-mongoose
库中,它期望某些字段(如 sid
)存在且定义正确。然而,在你的 ProjectSchema.js
文件中,SessionUserSchema
并没有定义 sid
字段。因此,当 session-mongoose
尝试访问 sid
字段时,抛出了 TypeError: Undefined type at 'paths.sid'
的错误。
解决方案
你需要确保在 SessionUserSchema
中定义 sid
字段,并且该字段与 session-mongoose
所需的一致。以下是一个修改后的示例:
// ProjectSchema.js
module.exports = function(mongoose) {
var Schema = mongoose.Schema;
var ProjectSchema = {
UserSchema: new Schema({
UserName: { type: String, index: true },
PassWord: String,
IsDeleted: { type: Boolean, default: false },
CreateDate: { type: Date, default: Date.now }
}, {
_id: true,
collection: 'core.User'
}),
SessionUserSchema: new Schema({
sid: String, // 添加 sid 字段
UserId: Schema.Types.ObjectId,
UserName: { type: String, index: true },
LoginTime: { type: Date, default: Date.now }
}, {
_id: true,
collection: 'safe.SessionUser'
})
};
return ProjectSchema;
};
优化数据库连接配置
为了使 mongoose
的数据库连接只配置一次并全局可用,可以将连接逻辑放在一个单独的模块中,并导出一个全局可用的函数或变量。
例如:
// db.js
const mongoose = require('mongoose');
const connectToDatabase = () => {
const dbconfig = require('./dbconfig.js'); // 读取配置文件
mongoose.connect(dbconfig.mongoose_constr, { useNewUrlParser: true, useUnifiedTopology: true });
};
module.exports = connectToDatabase;
然后在主应用文件中调用该函数:
// app.js
const express = require('express');
const connectToDatabase = require('./db.js');
const app = express();
connectToDatabase(); // 连接数据库
// 其他中间件和路由设置
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
这样可以确保数据库连接只初始化一次,并且可以在整个应用中全局使用。