node.js - Hvordan sette opp Typegoose
Hvordan setter jeg opp Typegoose for en NodeJs REST API og TypeScript?
Jeg får alltid rare feilmeldinger som MongoParseError: Incomplete key value pair for option eller jeg mottar ingen data, selv om det finnes noen.
Kan noen gi et komplett eksempel?
Svar #1
Hvis du vil programmere en API under følgende betingelser, kan du bruke det medfølgende minimale eksemplet nedenfor:
Betingelser: NodeJS Typescript MongoDB (lokalt)
Eksempel :
Hvis du jobber med TypeScript, anbefales en prosjektstruktur som ligner på denne:
├── dist
| ├── (your compiled JS)
├── src
| ├── models
| | ├── user.model.ts
| ├── user-repository.ts
| ├── app.ts
| ├── index.ts
├── test
| ├── (your tests)
Videre er det nødvendig å installere følgende pakker
npm install --save typescript mongoose express @types/express @types/mongoose typegooseindex.ts:
Denne filen har jeg bare for oppstartsformål
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:
Her foregår den faktiske logikken
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;
bruker-repositorium.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({});
}
}
bruker.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'}
})
Som åpenbart, hadde jeg en mongodb som kjørte lokalt, med en database kalt mongotest og inni den en samling kalt users.
