如何设置 Typegoose

Posted

技术标签:

【中文标题】如何设置 Typegoose【英文标题】:How to set up Typegoose 【发布时间】:2019-04-14 03:59:57 【问题描述】:

如何为 NodeJs REST API 和 typescript 设置 Typegoose?

我总是收到诸如MongoParseError: Incomplete key value pair for option 之类的奇怪错误消息,或者我没有收到任何数据,尽管有一些数据。

谁能提供一个完整的例子?

【问题讨论】:

【参考方案1】:

如果您想在以下条件下编写 API,可以使用下面提供的最小示例:

条件: NodeJS Typescript MongoDB (locally)

例子:

如果您正在使用 typescript,建议使用类似于此的项目结构:

├── dist
|   ├── (your compiled JS)
├── src
|   ├── models
|   |   ├── user.model.ts
|   ├── user-repository.ts
|   ├── app.ts
|   ├── index.ts
├── test
|   ├── (your tests)

另外,需要安装以下包

npm install --save typescript mongoose express @types/express @types/mongoose typegoose

index.ts:

这个文件,我只是用于引导目的

import app from './app';

const port = 3000;

app.listen(port, (err) => 
    if (err) 
        return console.log(err);
    
    return console.log('Server up and running on ' + port);
);

app.ts:

到这里,实际的逻辑在进行中

import  UserRepository  from './user-repository';
import * as express from 'express';

export class App 
    public app;

    constructor() 
        this.app = express();
        this.config();
        this.mountRoutes();
    

    private mountRoutes() 
        // Definition of the possible API routes
        this.app.route('/users')
            .get((req, res) => 
                var repo = new UserRepository();
                // we catch the result with the typical "then"
                repo.getUsers().then((x) => 
                    // .json(x) instead of .send(x) should also be okay
                    res.status(200).send(x);
                );
            );

        //               here with parameter
        //                      |
        //                      v
        this.app.route('/users/:id')
            .get((req, res) => 
                var repo = new UserRepository();

                repo.getUser(req.params.id).then((x) => 
                    res.status(200).send(x);
            );
        );
    


export default new App().app;

user-repository.ts

import * as mongoose from 'mongoose';
import  User, UserModel  from './models/user.model';


export class UserRepository 
    constructor() 
        //                protocol  host      port  database
        //                   |       |         |        |
        //                   v       v         v        v
        mongoose.connect('mongodb://localhost:27017/mongotest');
        // this only works, if your mongodb has no auth configured
        // if you need authentication, use the following:
        // mongoose.connect(MONGO_URL, 
        //     auth: 
        //         user: MONGO_DB_USER,
        //         password: MONGO_DB_PASSWORD
        //     ,
        // )
    

    async getUser(id: number): Promise<User> 
        //                  json query object as usual
        //                               |
        //                               v
        return UserModel.findOne("userId": id);
    

    async getUsers(): Promise<User[]> 
        return UserModel.find();
    

user.model.ts

import * as mongoose from 'mongoose';
import  prop, Typegoose  from 'typegoose';


export class User extends Typegoose
    // properties
    // |
    // v
    @prop()
    userId: number;
    @prop()
    firstname?: string;
    @prop()
    lastname: string;
    @prop()
    email: string;


export const UserModel = new User().getModelForClass(User, 
    existingMongoose: mongoose,
    //  had many problems without that definition of the collection name
    //  so better define it
    //                        |
    //                        v
    schemaOptions: collection: 'users'
)

很明显,我有一个本地运行的 mongodb,有一个名为 mongotest 的数据库,其中有一个名为 users 的集合。

【讨论】:

以上是关于如何设置 Typegoose的主要内容,如果未能解决你的问题,请参考以下文章

如何提取 typescript mongoose/typegoose 模式

Mongodb,Typegoose - 通用存储库模式

如何根据 typegoose 属性中的某些条件返回默认值?

如何在使用 Typegoose 获取数据时使用 class-transformer 序列化嵌套 js 响应?

Typescript typegoose getModelForClass 返回类型

用于 rest api 的 typegoose/mongoose 日期格式