টাইপস্ক্রিপ্ট উপায়ে মুঙ্গুজ…?


93

টাইপস্ক্রিপ্টে একটি মঙ্গুজ মডেল বাস্তবায়নের চেষ্টা করছেন। গুটিয়ে যাওয়া গুগল কেবল একটি হাইব্রিড পদ্ধতির (জেএস এবং টিএসের সংমিশ্রণ) প্রকাশ করেছে। জেএস ছাড়াই কেউ কীভাবে আমার ক্লাসের প্রয়োগের বিষয়ে আমার বরং নির্মোক্ত পদ্ধতির প্রয়োগ করবে?

ব্যাগেজ ছাড়াই IUserModel এ সক্ষম হতে চান।

import {IUser} from './user.ts';
import {Document, Schema, Model} from 'mongoose';

// mixing in a couple of interfaces
interface IUserDocument extends IUser,  Document {}

// mongoose, why oh why '[String]' 
// TODO: investigate out why mongoose needs its own data types
let userSchema: Schema = new Schema({
  userName  : String,
  password  : String,
  firstName : String,
  lastName  : String,
  email     : String,
  activated : Boolean,
  roles     : [String]
});

// interface we want to code to?
export interface IUserModel extends Model<IUserDocument> {/* any custom methods here */}

// stumped here
export class User {
  constructor() {}
}

Userক্লাস হতে পারে না কারণ একটি তৈরি করা একটি অ্যাসিঙ্ক অপারেশন। এটি একটি প্রতিশ্রুতি ফিরিয়ে দিতে হবে যাতে আপনাকে কল করতে হবে User.create({...}).then...
লুয়ে আলাক্কাদ

4
বিশেষত, ওপিতে কোডে দেওয়া, আপনি কেন দয়া করে Userশ্রেণি হতে পারবেন না তা বিস্তারিত বলতে পারেন?
টিম ম্যাকনামারা

পরিবর্তে github.com/typeorm/typeorm চেষ্টা করুন ।
এরিখ

@ এরিচ তারা বলেছেন যে টাইঙ্গারম মঙ্গোডিবি-র সাথে ভালভাবে কাজ করে না, টাইপ হংস একটি ভাল বিকল্প
পেয়ামবিরামি

উত্তর:


132

আমি এটি কীভাবে করব তা এখানে:

export interface IUser extends mongoose.Document {
  name: string; 
  somethingElse?: number; 
};

export const UserSchema = new mongoose.Schema({
  name: {type:String, required: true},
  somethingElse: Number,
});

const User = mongoose.model<IUser>('User', UserSchema);
export default User;

4
দুঃখিত, তবে 'মঙ্গুজ' টিএস-তে সংজ্ঞায়িত কীভাবে?
টিম ম্যাকনামারা

13
import * as mongoose from 'mongoose';বাimport mongoose = require('mongoose');
লুয়ে আলাক্কাদ

4
এরকম কিছু:import User from '~/models/user'; User.find(/*...*/).then(/*...*/);
লুই অলক্কাদ

4
শেষ লাইন (রফতানি ডিফল্ট কনট ব্যবহারকারী ...) আমার পক্ষে কাজ করে না। আমাকে লাইনটি বিভক্ত করতে হবে, প্রস্তাবিত স্ট্যাকওভারফ্লো
সেরজিও

7
আমি let newUser = new User({ iAmNotHere: true })আইডিইতে বা সংকলনে কোনও ত্রুটি ছাড়াই করতে পারি । তাহলে ইন্টারফেস তৈরির কারণ কী?
লুপুরাস

34

আপনি যদি আপনার ধরণের সংজ্ঞা এবং ডাটাবেস বাস্তবায়ন আলাদা করতে চান তবে অন্য একটি বিকল্প।

import {IUser} from './user.ts';
import * as mongoose from 'mongoose';

type UserType = IUser & mongoose.Document;
const User = mongoose.model<UserType>('User', new mongoose.Schema({
    userName  : String,
    password  : String,
    /* etc */
}));

এখান থেকে অনুপ্রেরণা: https://github.com/Appsilon/styleguide/wiki/mongoose-typescript- মডেল


4
mongoose.Schemaএখানে সংজ্ঞাটি কি ক্ষেত্রগুলি নকল করে IUser? প্রদত্ত যে IUserএকটি সংজ্ঞায়িত করা হয় আলাদা ফাইল ঝুঁকি সঙ্গে ক্ষেত্র সিঙ্ক নামা প্রকল্প হিসেবে জটিলতা এবং বিকাশকারীরা সংখ্যা বৃদ্ধি, বেশ উচ্চ।
ড্যান ড্যাসকলেসকু

হ্যাঁ, এটি বিবেচনার জন্য একটি বৈধ যুক্তি। উপাদান সংহত পরীক্ষার ব্যবহার ঝুঁকি হ্রাস করতে পারে যদিও। এবং নোট করুন যে এমন পদ্ধতির এবং আর্কিটেকচার রয়েছে যেখানে টাইপ ডিক্লেয়ারেশন এবং ডিবি বাস্তবায়নগুলি কোনও ওআরএম (যেমন আপনি প্রস্তাব করেছিলেন) বা ম্যানুয়ালি (এই উত্তরের মত) এর মাধ্যমে সম্পন্ন হয়েছে তা পৃথক করা হয়েছে। সিলভার বুলেট নেই ... <(°। °)>
গবর ইম্রে

একটি বুলেট গ্রাফকিউএল সংজ্ঞা থেকে টাইপস্ক্রিপ্ট এবং মঙ্গুজের কোড তৈরি করা হতে পারে ।
ড্যান ড্যাসকলেসকু

24

নেক্রোপস্টিংয়ের জন্য দুঃখিত তবে এটি কারওর জন্য এখনও আকর্ষণীয় হতে পারে। আমি মনে করি টাইপগুজ মডেলগুলি সংজ্ঞায়িত করার জন্য আরও আধুনিক এবং মার্জিত উপায় সরবরাহ করে

এখানে ডক্স থেকে একটি উদাহরণ দেওয়া হয়েছে:

import { prop, Typegoose, ModelType, InstanceType } from 'typegoose';
import * as mongoose from 'mongoose';

mongoose.connect('mongodb://localhost:27017/test');

class User extends Typegoose {
    @prop()
    name?: string;
}

const UserModel = new User().getModelForClass(User);

// UserModel is a regular Mongoose Model with correct types
(async () => {
    const u = new UserModel({ name: 'JohnDoe' });
    await u.save();
    const user = await UserModel.findOne();

    // prints { _id: 59218f686409d670a97e53e0, name: 'JohnDoe', __v: 0 }
    console.log(user);
})();

বিদ্যমান সংযোগের দৃশ্যের জন্য, আপনি নিম্নলিখিত হিসাবে ব্যবহার করতে পারেন (যা প্রকৃত পরিস্থিতিতে বেশি সম্ভবত এবং ডক্সে অনাবৃত হতে পারে):

import { prop, Typegoose, ModelType, InstanceType } from 'typegoose';
import * as mongoose from 'mongoose';

const conn = mongoose.createConnection('mongodb://localhost:27017/test');

class User extends Typegoose {
    @prop()
    name?: string;
}

// Notice that the collection name will be 'users':
const UserModel = new User().getModelForClass(User, {existingConnection: conn});

// UserModel is a regular Mongoose Model with correct types
(async () => {
    const u = new UserModel({ name: 'JohnDoe' });
    await u.save();
    const user = await UserModel.findOne();

    // prints { _id: 59218f686409d670a97e53e0, name: 'JohnDoe', __v: 0 }
    console.log(user);
})();

8
আমি এই সিদ্ধান্তেও পৌঁছেছি, তবে চিন্তিত যে এতে typegooseপর্যাপ্ত সমর্থন নেই ... তাদের এনপিএমের পরিসংখ্যান পরীক্ষা করে দেখুন, এটি কেবলমাত্র 3k সাপ্তাহিক ডাউনলোড এবং আরএন প্রায় 100 টি খোলা গিথুব ইস্যু রয়েছে, যার বেশিরভাগেরই মন্তব্য নেই, এবং এর মধ্যে
বেশিরভাগের

@ কর্বফন আপনি কি এটি ব্যবহার করে দেখেছেন? যদি তা হয় তবে আপনার অনুসন্ধানগুলি কী ছিল? যদি তা না হয় তবে অন্য কিছু ছিল যা আপনাকে এটি ব্যবহার না করার সিদ্ধান্ত নিয়েছে? আমি সাধারণত কিছু লোককে সম্পূর্ণ সমর্থন সম্পর্কে উদ্বিগ্ন হতে দেখি তবে যারা মনে হয়
এটিরাই

4
@ এন 4 পিপিএল আমি সাথে যাব না typegoose- আমরা এই পোস্টের মতোই ম্যানুয়ালি আমাদের টাইপিং হ্যান্ডল করেছিলাম, দেখে মনে হচ্ছে ts-mongooseকিছু প্রতিশ্রুতি থাকতে পারে (পরবর্তী উত্তর হিসাবে প্রস্তাবিত)
কর্বফোন

4
"নেক্রোপোস্টিং" এর জন্য কখনও ক্ষমা চাইবেন না। [যেমনটি আপনি এখন জানেন ...] এখানে কেবলমাত্র এটি করার জন্য একটি ব্যাজ রয়েছে (যদিও এর নাম নেক্রোম্যান্সার ; ^ ডি) রয়েছে! Necroposting নতুন তথ্য এবং ধারণা উত্সাহিত করা হয়!
ruffin

4
@ আরফিন: সমস্যাগুলির নতুন এবং আপ-টু ডেট সমাধান পোস্ট করার বিরুদ্ধে কলঙ্ক আমি আসলেও বুঝতে পারি না।
ড্যান ড্যাসকলেসকু

16

ব্যবহার করে দেখুন ts-mongoose। এটি ম্যাপিং করতে শর্তসাপূর্ণ প্রকারগুলি ব্যবহার করে।

import { createSchema, Type, typedModel } from 'ts-mongoose';

const UserSchema = createSchema({
  username: Type.string(),
  email: Type.string(),
});

const User = typedModel('User', UserSchema);

4
খুব প্রতিশ্রুতিবদ্ধ দেখাচ্ছে! ভাগ করে নেওয়ার জন্য ধন্যবাদ! :)
বোরিয়েল

4
কি দারুন. এই লক খুব চটকদার। এটি চেষ্টা করার জন্য অপেক্ষা করছি!
Qqilihq

4
প্রকাশ: টিএস-মঙ্গুজ আকাশ দ্বারা নির্মিত বলে মনে হচ্ছে। এটি খুব চটজলদি সমাধান বলে মনে হচ্ছে।
mic


11

এখানে বেশিরভাগ উত্তর টাইপস্ক্রিপ্ট শ্রেণি / ইন্টারফেস এবং মঙ্গুজ স্কিমাতে ক্ষেত্রগুলি পুনরাবৃত্তি করে। সত্যের একক উত্স না থাকা রক্ষণাবেক্ষণ ঝুঁকির প্রতিনিধিত্ব করে, কারণ প্রকল্পটি আরও জটিল হয়ে ওঠে এবং আরও বিকাশকারীরা এটিতে কাজ করে: ক্ষেত্রগুলি সিঙ্ক থেকে বেরিয়ে আসার সম্ভাবনা বেশি । এটি বিশেষত খারাপ হয় যখন ক্লাসটি একটি ভিন্ন ফাইলে বনাম মঙ্গুজ স্কিমাতে থাকে।

ক্ষেত্রগুলিকে সিঙ্কে রাখতে, সেগুলি একবারে সংজ্ঞায়িত করা বোধগম্য। কয়েকটি লাইব্রেরি রয়েছে যা এটি করে:

আমি এখনও তাদের কারও দ্বারা পুরোপুরি নিশ্চিত হইনি তবে টাইপগুজ সক্রিয়ভাবে বজায় রয়েছে বলে মনে হয় এবং বিকাশকারী আমার পিআরগুলি গ্রহণ করে।

এক ধাপ এগিয়ে ভাবতে: আপনি যখন মিশ্রণে একটি গ্রাফকিউএল স্কিমা যুক্ত করেন, তখন মডেলের নকলের আরও একটি স্তর উপস্থিত হয়। এই সমস্যাটি কাটিয়ে ওঠার একটি উপায় গ্রাফকিউএল স্কিমা থেকে টাইপস্ক্রিপ্ট এবং মঙ্গুজ কোড তৈরি করা হতে পারে ।


5

মঙ্গুজ স্কীমার সাথে প্লেইন মডেলটির সাথে মেলে একটি শক্তভাবে টাইপ করা উপায়। সংকলকটি মঙ্গুজকে দেওয়া সংজ্ঞাগুলি নিশ্চিত করবে che আপনার একবার স্কিমা হয়ে গেলে আপনি ব্যবহার করতে পারেন

সাধারণ.ts

export type IsRequired<T> =
  undefined extends T
  ? false
  : true;

export type FieldType<T> =
  T extends number ? typeof Number :
  T extends string ? typeof String :
  Object;

export type Field<T> = {
  type: FieldType<T>,
  required: IsRequired<T>,
  enum?: Array<T>
};

export type ModelDefinition<M> = {
  [P in keyof M]-?:
    M[P] extends Array<infer U> ? Array<Field<U>> :
    Field<M[P]>
};

user.ts

import * as mongoose from 'mongoose';
import { ModelDefinition } from "./common";

interface User {
  userName  : string,
  password  : string,
  firstName : string,
  lastName  : string,
  email     : string,
  activated : boolean,
  roles     : Array<string>
}

// The typings above expect the more verbose type definitions,
// but this has the benefit of being able to match required
// and optional fields with the corresponding definition.
// TBD: There may be a way to support both types.
const definition: ModelDefinition<User> = {
  userName  : { type: String, required: true },
  password  : { type: String, required: true },
  firstName : { type: String, required: true },
  lastName  : { type: String, required: true },
  email     : { type: String, required: true },
  activated : { type: Boolean, required: true },
  roles     : [ { type: String, required: true } ]
};

const schema = new mongoose.Schema(
  definition
);

আপনার স্কিমাটি একবার হয়ে গেলে আপনি অন্যান্য উত্তরে উল্লিখিত পদ্ধতিগুলি ব্যবহার করতে পারেন যেমন

const userModel = mongoose.model<User & mongoose.Document>('User', schema);

4
এটিই একমাত্র সঠিক উত্তর। অন্যান্য উত্তরগুলির কোনওটিই স্কিমা এবং প্রকার / ইন্টারফেসের মধ্যে টাইপের সামঞ্জস্যতা নিশ্চিত করে নি।
জেমি স্ট্রস


4
পছন্দ করুন
জেমি স্ট্রস

5

কেবল অন্য উপায় যুক্ত করুন ( @types/mongooseঅবশ্যই এটি ইনস্টল করা উচিত npm install --save-dev @types/mongoose)

import { IUser } from './user.ts';
import * as mongoose from 'mongoose';

interface IUserModel extends IUser, mongoose.Document {}

const User = mongoose.model<IUserModel>('User', new mongoose.Schema({
    userName: String,
    password: String,
    // ...
}));

মধ্যে পার্থক্য interfaceএবং type, দয়া করে পড়ুন এই উত্তর

এই উপায়টির একটি সুবিধা রয়েছে, আপনি মঙ্গুজ স্থিতিশীল পদ্ধতি টাইপগুলি যুক্ত করতে পারেন:

interface IUserModel extends IUser, mongoose.Document {
  generateJwt: () => string
}

আপনি কোথায় সংজ্ঞা দিয়েছেন generateJwt?
রিল্ভ করে

4
@ রিলগুলি const User = mongoose.model.... password: String, generateJwt: () => { return someJwt; } }));মূলত, generateJwtমডেলের অন্য সম্পত্তি হয়ে যায়।
স্মাইল

আপনি কি কেবল এই ফ্যাশনে এটি একটি পদ্ধতি হিসাবে যুক্ত করবেন বা আপনি কী এটি পদ্ধতির সম্পত্তিতে সংযুক্ত করবেন?
ব্যবহারকারী 1790300

4
এটি ব্যবহারকারীর সংজ্ঞা এবং ব্যবহারকারীর ডালকে আলাদা করে রাখায় এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। আপনি যদি মঙ্গো থেকে অন্য ডিবি সরবরাহকারীর কাছে যেতে চান তবে আপনাকে ব্যবহারকারী ইন্টারফেসটি পরিবর্তন করতে হবে না।
রাফায়েল ডেল রিও

4
@ রাফায়েলডিলিও: প্রশ্নটি টাইপস্ক্রিপ্টের সাথে মঙ্গুজ ব্যবহারের বিষয়ে ছিল। অন্য ডিবিতে স্যুইচ করা এই লক্ষ্যটির বিরোধী। এবং অন্য একটি ফাইলেরIUser ইন্টারফেস ঘোষণার থেকে স্কিমা সংজ্ঞা পৃথক করার ক্ষেত্রে সমস্যাটি হ'ল প্রকল্পটি জটিলতা এবং বিকাশকারীদের সংখ্যায় বৃদ্ধি পাওয়ায় ক্ষেত্রগুলি সিঙ্কের বাইরে চলে যাওয়ার ঝুঁকি বেশ বেশি।
ড্যান ড্যাসকলেসকু

4

মাইক্রোসফ্টের ছেলেরা কীভাবে এটি করে তা এখানে। এখানে

import mongoose from "mongoose";

export type UserDocument = mongoose.Document & {
    email: string;
    password: string;
    passwordResetToken: string;
    passwordResetExpires: Date;
...
};

const userSchema = new mongoose.Schema({
    email: { type: String, unique: true },
    password: String,
    passwordResetToken: String,
    passwordResetExpires: Date,
...
}, { timestamps: true });

export const User = mongoose.model<UserDocument>("User", userSchema);

আপনি যখন আপনার নোড প্রকল্পে টাইপস্ক্রিপ্ট যুক্ত করেন তখন আমি এই দুর্দান্ত স্টার্টার প্রকল্পটি পরীক্ষা করে দেখার পরামর্শ দিই।

https://github.com/microsoft/TypeScript- নোড- স্টার্টার


4
এটি মঙ্গুজ এবং টাইপস্ক্রিপ্টের মধ্যে প্রতিটি একক ক্ষেত্রের নকল করে, যা মডেলটি আরও জটিল হওয়ার সাথে সাথে রক্ষণাবেক্ষণের ঝুঁকি তৈরি করে। সলিউশন পছন্দ ts-mongooseএবং typegooseবেশ অন্বিত cruft একটি বিট সঙ্গে যে সমস্যা সমাধানের, যদিও বোঝা যাচ্ছে যে নেতারা।
ড্যান ড্যাসক্লেস্কু

2

এই vscode intellisenseউভয় উপর কাজ করে

  • ইউজার টাইপ ইউজার.ফাইন্ডঅন
  • ব্যবহারকারী উদাহরণ u1._id

কোড:

// imports
import { ObjectID } from 'mongodb'
import { Document, model, Schema, SchemaDefinition } from 'mongoose'

import { authSchema, IAuthSchema } from './userAuth'

// the model

export interface IUser {
  _id: ObjectID, // !WARNING: No default value in Schema
  auth: IAuthSchema
}

// IUser will act like it is a Schema, it is more common to use this
// For example you can use this type at passport.serialize
export type IUserSchema = IUser & SchemaDefinition
// IUser will act like it is a Document
export type IUserDocument = IUser & Document

export const userSchema = new Schema<IUserSchema>({
  auth: {
    required: true,
    type: authSchema,
  }
})

export default model<IUserDocument>('user', userSchema)


2

এখানে মঙ্গুজ ডকুমেন্টেশনের উদাহরণ, ES6 ক্লাস থেকে লোডক্লাস () ব্যবহার করে টাইপস্ক্রিপ্টে রূপান্তর করা হয়েছে:

import { Document, Schema, Model, model } from 'mongoose';
import * as assert from 'assert';

const schema = new Schema<IPerson>({ firstName: String, lastName: String });

export interface IPerson extends Document {
  firstName: string;
  lastName: string;
  fullName: string;
}

class PersonClass extends Model {
  firstName!: string;
  lastName!: string;

  // `fullName` becomes a virtual
  get fullName() {
    return `${this.firstName} ${this.lastName}`;
  }

  set fullName(v) {
    const firstSpace = v.indexOf(' ');
    this.firstName = v.split(' ')[0];
    this.lastName = firstSpace === -1 ? '' : v.substr(firstSpace + 1);
  }

  // `getFullName()` becomes a document method
  getFullName() {
    return `${this.firstName} ${this.lastName}`;
  }

  // `findByFullName()` becomes a static
  static findByFullName(name: string) {
    const firstSpace = name.indexOf(' ');
    const firstName = name.split(' ')[0];
    const lastName = firstSpace === -1 ? '' : name.substr(firstSpace + 1);
    return this.findOne({ firstName, lastName });
  }
}

schema.loadClass(PersonClass);
const Person = model<IPerson>('Person', schema);

(async () => {
  let doc = await Person.create({ firstName: 'Jon', lastName: 'Snow' });
  assert.equal(doc.fullName, 'Jon Snow');
  doc.fullName = 'Jon Stark';
  assert.equal(doc.firstName, 'Jon');
  assert.equal(doc.lastName, 'Stark');

  doc = (<any>Person).findByFullName('Jon Snow');
  assert.equal(doc.fullName, 'Jon Snow');
})();

স্থির findByFullNameপদ্ধতির জন্য, টাইপ তথ্যটি কীভাবে পাওয়া যায় তা আমি বুঝতে পারি না Person, তাই <any>Personযখন আমি এটি কল করতে চাই তখন আমাকে কাস্ট করতে হয়েছিল। যদি আপনি কীভাবে এটি ঠিক করতে জানেন তবে একটি মন্তব্য যুক্ত করুন।


অন্যান্য উত্তরের মতো , এই পদ্ধতির ইন্টারফেস এবং স্কিমার মধ্যে ক্ষেত্রগুলি নকল করে। এটি সত্যের একক উত্স থাকার মাধ্যমে এড়ানো যেতে পারে, যেমন ব্যবহার করে ts-mongooseবা দ্বারা typegoose। গ্রাফকিউএল স্কিমা সংজ্ঞায়িত করার সময় পরিস্থিতিটি আরও নকল হয়ে যায়।
ড্যান ড্যাসকলেসকু

এই পদ্ধতির সাথে রিফ সংজ্ঞা দেওয়ার কোনও উপায়?
ড্যান ড্যাসকলেসকু

2

আমি প্লামিয়ারের একজন ভক্ত, এটিতে মঙ্গস সহায়ক রয়েছে , তবে এটি প্লামিয়ার ছাড়া নিজেই ব্যবহার করা যেতে পারে । টাইপগোজের বিপরীতে প্লামিয়ারের উত্সর্গীকৃত প্রতিচ্ছবি গ্রন্থাগারটি ব্যবহার করে এটি বিভিন্ন পথ নিয়েছিল, এটি শীতল সামগ্রীর ব্যবহার সম্ভব করে।

বৈশিষ্ট্য

  1. খাঁটি পোজো (ডোমেনের কোনও শ্রেণীর উত্তরাধিকারী হওয়া বা কোনও বিশেষ ডেটা ধরণের ব্যবহারের দরকার নেই), তৈরি হওয়া মডেলটি স্বয়ংক্রিয়ভাবে অনুমিত হয় T & Document হয় যার ফলে নথির সাথে সম্পর্কিত বৈশিষ্ট্য অ্যাক্সেস করা সম্ভব।
  2. সমর্থিত টাইপস্ক্রিপ্ট প্যারামিটার বৈশিষ্ট্য, আপনার কাছে থাকলে এটি ভাল strict:true টিএসকনফিগ কনফিগারেশন থাকলে । এবং প্যারামিটার বৈশিষ্ট্যগুলির সাথে সমস্ত বৈশিষ্ট্যে ডেকরেটারের প্রয়োজন হয় না।
  3. টাইপগসের মতো সমর্থিত ক্ষেত্রের বৈশিষ্ট্য
  4. কনফিগারেশনটি মঙ্গুজের মতোই তাই এটির সাথে আপনি সহজেই পরিচিত হন।
  5. সমর্থিত উত্তরাধিকার যা প্রোগ্রামিংকে আরও প্রাকৃতিক করে তোলে।
  6. মডেল বিশ্লেষণ, মডেলগুলির নাম এবং এটির যথাযথ সংগ্রহের নাম, কনফিগারেশন প্রয়োগ করা ইত্যাদি

ব্যবহার

import model, {collection} from "@plumier/mongoose"


@collection({ timestamps: true, toJson: { virtuals: true } })
class Domain {
    constructor(
        public createdAt?: Date,
        public updatedAt?: Date,
        @collection.property({ default: false })
        public deleted?: boolean
    ) { }
}

@collection()
class User extends Domain {
    constructor(
        @collection.property({ unique: true })
        public email: string,
        public password: string,
        public firstName: string,
        public lastName: string,
        public dateOfBirth: string,
        public gender: string
    ) { super() }
}

// create mongoose model (can be called multiple time)
const UserModel = model(User)
const user = await UserModel.findById()

1

বিদ্যমান মোঙ্গুজ প্রকল্পগুলির সমাধান সন্ধানের জন্য যে কেউ:

আমরা সম্প্রতি এই সমস্যাটির সমাধানের জন্য মঙ্গুজ-tsgen তৈরি করেছি (কিছু প্রতিক্রিয়া পছন্দ করব!)। টাইপগোজের মতো বিদ্যমান সমাধানগুলির জন্য আমাদের সম্পূর্ণ স্কিমগুলি আবার লিখতে হবে এবং বিভিন্ন অসুবিধাগুলি প্রবর্তিত হয়েছিল। মঙ্গুজ-টিজেন একটি সাধারণ সি এল আই সরঞ্জাম যা আপনার সমস্ত মঙ্গুজ স্কিমার জন্য টাইপস্ক্রিপ্ট ইন্টারফেসগুলি যুক্ত একটি সূচক.ড.টি.এস ফাইল তৈরি করে; এটির জন্য কোনও কনফিগারেশন অল্প প্রয়োজন এবং যে কোনও টাইপস্ক্রিপ্ট প্রকল্পের সাথে খুব সহজেই সংহত করে।


1

আপনি যদি নিশ্চিত করতে চান যে আপনার স্কিমা মডেল ধরণের এবং তদ্বিপরীতভাবে সন্তুষ্ট হয় তবে এই সমাধানটি @ বিবেলসের পরামর্শের চেয়ে আরও ভাল টাইপিংয়ের প্রস্তাব করে:

সাধারণ ধরণের ফাইল: ToSchema.ts(আতঙ্কিত হবেন না! কেবল এটি অনুলিপি করুন এবং আটকান)

import { Document, Schema, SchemaType, SchemaTypeOpts } from 'mongoose';

type NonOptionalKeys<T> = { [k in keyof T]-?: undefined extends T[k] ? never : k }[keyof T];
type OptionalKeys<T> = Exclude<keyof T, NonOptionalKeys<T>>;
type NoDocument<T> = Exclude<T, keyof Document>;
type ForceNotRequired = Omit<SchemaTypeOpts<any>, 'required'> & { required?: false };
type ForceRequired = Omit<SchemaTypeOpts<any>, 'required'> & { required: SchemaTypeOpts<any>['required'] };

export type ToSchema<T> = Record<NoDocument<NonOptionalKeys<T>>, ForceRequired | Schema | SchemaType> &
   Record<NoDocument<OptionalKeys<T>>, ForceNotRequired | Schema | SchemaType>;

এবং একটি উদাহরণ মডেল:

import { Document, model, Schema } from 'mongoose';
import { ToSchema } from './ToSchema';

export interface IUser extends Document {
   name?: string;
   surname?: string;
   email: string;
   birthDate?: Date;
   lastLogin?: Date;
}

const userSchemaDefinition: ToSchema<IUser> = {
   surname: String,
   lastLogin: Date,
   role: String, // Error, 'role' does not exist
   name: { type: String, required: true, unique: true }, // Error, name is optional! remove 'required'
   email: String, // Error, property 'required' is missing
   // email: {type: String, required: true}, // correct 👍
   // Error, 'birthDate' is not defined
};

const userSchema = new Schema(userSchemaDefinition);

export const User = model<IUser>('User', userSchema);



0

এখানে README এর উপর ভিত্তি করে একটি উদাহরণ দেওয়া আছে @types/mongoose প্যাকেজটির ।

এটি ইতিমধ্যে উপরে অন্তর্ভুক্ত উপাদানগুলি ছাড়াও এটি নিয়মিত এবং স্থির পদ্ধতিগুলি কীভাবে অন্তর্ভুক্ত করবেন তা দেখায়:

import { Document, model, Model, Schema } from "mongoose";

interface IUserDocument extends Document {
  name: string;
  method1: () => string;
}
interface IUserModel extends Model<IUserDocument> {
  static1: () => string;
}

var UserSchema = new Schema<IUserDocument & IUserModel>({
  name: String
});

UserSchema.methods.method1 = function() {
  return this.name;
};
UserSchema.statics.static1 = function() {
  return "";
};

var UserModel: IUserModel = model<IUserDocument, IUserModel>(
  "User",
  UserSchema
);
UserModel.static1(); // static methods are available

var user = new UserModel({ name: "Success" });
user.method1();

সাধারণভাবে, এই READMEটি মঙ্গুসের সাথে প্রকারের কাছে যাওয়ার জন্য দুর্দান্ত উত্স বলে মনে হয়।


এই পদ্ধতির প্রতিটি ক্ষেত্রের সংজ্ঞাটি এর থেকে অনুলিপি করে IUserDocumentতোলে UserSchemaযা মডেলটি আরও জটিল হওয়ার সাথে সাথে রক্ষণাবেক্ষণের ঝুঁকি তৈরি করে। প্যাকেজগুলি পছন্দ করে ts-mongooseএবং typegooseসমস্যাটি সমাধান করার চেষ্টা করে, যদিও স্বল্প পরিমাণে সিন্ট্যাকটিক ক্রাফ্ট সহ।
ড্যান ড্যাসকলেসকু

0

সর্বশেষতম মঙ্গুজ প্যাকেজটি টাইপস্ক্রিপ্ট সমর্থন নিয়ে এসেছে। আপনার আর @ টাইপ / মঙ্গুজ ব্যবহার করার দরকার নেই। আমার উদাহরণ এখানে দেখুন।

https://jasonching2005.medium.com/complete-guide-for- using-typescript-in-mongoose-with-lean-function-e55adf1189dc

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.