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;

}


2 回复

根据你提供的代码和报错信息,错误发生在 session-mongoose 插件中,具体是在处理 sid 字段时遇到了未定义类型的问题。这通常是因为 SessionUser 模型中的字段定义不正确或缺少必要的字段。

错误分析

错误提示 TypeError: Undefined type atpaths.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');
});

这样可以确保数据库连接只初始化一次,并且可以在整个应用中全局使用。

回到顶部