Node.js 使用typescript的Mongoose键入问题
我正在使用mongoose和typescript构建一个应用程序。以下是我制作的一个简单模型:Node.js 使用typescript的Mongoose键入问题,node.js,typescript,mongoose,definitelytyped,Node.js,Typescript,Mongoose,Definitelytyped,我正在使用mongoose和typescript构建一个应用程序。以下是我制作的一个简单模型: import * as callbackMongoose from 'mongoose'; var mongoose = callbackMongoose; mongoose.Promise = global.Promise; const Schema = mongoose.Schema; var userSchema = new Schema({ username: String,
import * as callbackMongoose from 'mongoose';
var mongoose = callbackMongoose;
mongoose.Promise = global.Promise;
const Schema = mongoose.Schema;
var userSchema = new Schema({
username: String,
email: String,
hash: String
});
export default mongoose.model('User', userSchema);
它工作得很好,但在访问属性之前,我需要将每个文档强制转换为任何文档。我读过一本指南,上面说我可以做到这一点:
interface IUser extends mongoose.Document {
username: String;
email: String;
hash: String;
}
export default mongoose.model<IUser>('User', userSchema);
这些类型确实适用于Schema,它们也适用于我使用的所有其他库。这些类型定义有问题吗?我做错什么了吗?TypeScript@2.0
我想你可以用
npm install @types/mongoose --save
而不是:
npm install @typings/mongoose --save
这是一个完整的例子:
数据库.ts
import mongoose = require('mongoose');
mongoose.Promise = global.Promise;
mongoose.connect('mongodb://admin:123456@ds149437.mlab.com:49437/samples');
export { mongoose };
import { mongoose } from './../../Services/Database';
export interface UserData {
is_temporary: boolean;
is_verified: boolean;
status: boolean;
username: string;
}
export interface IUserData extends UserData, mongoose.Document, mongoose.PassportLocalDocument { };
import { IUserData } from './UserData';
import { mongoose } from './../../Services/Database';
import * as passportLocalMongoose from 'passport-local-mongoose';
import Schema = mongoose.Schema;
const UserSchema = new Schema({
username: { type: String, required: true },
password: String,
status: { type: Boolean, required: true },
is_verified: { type: Boolean, required: true },
is_temporary: { type: Boolean, required: true }
});
UserSchema.plugin(passportLocalMongoose);
var UserModel;
try {
// Throws an error if 'Name' hasn't been registered
UserModel = mongoose.model('User')
} catch (e) {
UserModel = mongoose.model<IUserData>('User', UserSchema);
}
export = UserModel;
UserData.ts
import mongoose = require('mongoose');
mongoose.Promise = global.Promise;
mongoose.connect('mongodb://admin:123456@ds149437.mlab.com:49437/samples');
export { mongoose };
import { mongoose } from './../../Services/Database';
export interface UserData {
is_temporary: boolean;
is_verified: boolean;
status: boolean;
username: string;
}
export interface IUserData extends UserData, mongoose.Document, mongoose.PassportLocalDocument { };
import { IUserData } from './UserData';
import { mongoose } from './../../Services/Database';
import * as passportLocalMongoose from 'passport-local-mongoose';
import Schema = mongoose.Schema;
const UserSchema = new Schema({
username: { type: String, required: true },
password: String,
status: { type: Boolean, required: true },
is_verified: { type: Boolean, required: true },
is_temporary: { type: Boolean, required: true }
});
UserSchema.plugin(passportLocalMongoose);
var UserModel;
try {
// Throws an error if 'Name' hasn't been registered
UserModel = mongoose.model('User')
} catch (e) {
UserModel = mongoose.model<IUserData>('User', UserSchema);
}
export = UserModel;
UserModel.ts
import mongoose = require('mongoose');
mongoose.Promise = global.Promise;
mongoose.connect('mongodb://admin:123456@ds149437.mlab.com:49437/samples');
export { mongoose };
import { mongoose } from './../../Services/Database';
export interface UserData {
is_temporary: boolean;
is_verified: boolean;
status: boolean;
username: string;
}
export interface IUserData extends UserData, mongoose.Document, mongoose.PassportLocalDocument { };
import { IUserData } from './UserData';
import { mongoose } from './../../Services/Database';
import * as passportLocalMongoose from 'passport-local-mongoose';
import Schema = mongoose.Schema;
const UserSchema = new Schema({
username: { type: String, required: true },
password: String,
status: { type: Boolean, required: true },
is_verified: { type: Boolean, required: true },
is_temporary: { type: Boolean, required: true }
});
UserSchema.plugin(passportLocalMongoose);
var UserModel;
try {
// Throws an error if 'Name' hasn't been registered
UserModel = mongoose.model('User')
} catch (e) {
UserModel = mongoose.model<IUserData>('User', UserSchema);
}
export = UserModel;
从“/UserData”导入{IUserData};
从“/../../Services/Database”导入{mongoose};
从“passport local mongoose”导入*作为passport local mongoose;
导入Schema=mongoose.Schema;
const UserSchema=新模式({
用户名:{type:String,必需:true},
密码:String,
状态:{type:Boolean,必需:true},
已验证:{type:Boolean,必需:true},
是临时的:{type:Boolean,必需:true}
});
插件(passportLocalMongoose);
var用户模型;
试一试{
//如果尚未注册“Name”,则引发错误
UserModel=mongoose.model('User')
}捕获(e){
UserModel=mongoose.model('User',UserSchema);
}
导出=用户模型;
我还在这里使用typescript、node.js、mongoose和passport.js提供了完整的项目示例:
祝你好运。原来问题在于我将导入赋值给了一个变量。我使用了一种类似于您在
Database.ts
中描述的方法来修复它,因此您的答案是正确的。谢谢非常感谢你!