如何设置Typegoose

Fre*_*uer 5 mongoose mongodb node.js typescript

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

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

有人可以提供完整的示例吗?

Fre*_*uer 5

如果要在以下情况下编程API,可以使用下面提供的最小示例:

条件: NodeJS Typescript MongoDB (locally)

例:

如果您使用的是打字稿,建议使用类似于此的项目结构:

??? dist
|   ??? (your compiled JS)
??? src
|   ??? models
|   |   ??? user.model.ts
|   ??? user-repository.ts
|   ??? app.ts
|   ??? index.ts
??? test
|   ??? (your tests)
Run Code Online (Sandbox Code Playgroud)

此外,还需要安装以下软件包

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);
});
Run Code Online (Sandbox Code Playgroud)

应用程式:

在这里,实际的逻辑还在继续

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;
Run Code Online (Sandbox Code Playgroud)

用户存储库

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({});
    }
}
Run Code Online (Sandbox Code Playgroud)

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'}
})
Run Code Online (Sandbox Code Playgroud)

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