如何设置 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 模式
如何在使用 Typegoose 获取数据时使用 class-transformer 序列化嵌套 js 响应?