У меня очень простой сервер, который можно запустить тремя способами:
[BLOCK 2 ENABLED]
/ [BLOCK 1 DISABLED]
Определение интерфейсов, схемы и модели в одном файле.
[BLOCK 1 ENABLED]
/ [BLOCK 2 DISABLED]
Определение интерфейсов, схемы и модели во внешнем файле: . / Models / user.ts
Содержимое [BLOCK 2]
точно такое же, как содержимое файла: . / Models / user.ts .
- С другой стороны, если я переместу файл: user.ts в:
. / Server / models / user.ts
тогда код работает правильно, но по некоторым конкретным причинам он мне нужен по адресу:
. / Модели / user.ts
На всякий случай, здесь у вас есть хранилище:
https://github.com/napolev/mongodb-experiments
Вот код:
. / Server / server.ts [BLOCK 2 ENABLED]
import * as mongoose from 'mongoose';
import * as colors from 'colors';
/*/
// BLOCK 1:
import { User, IUserDocument } from '../models/user';
/*/
// BLOCK 2:
import { Document, Schema, Model, model} from "mongoose";
export interface IUser {
username: string,
password: string,
email: string,
company: string,
}
export interface IUserDocument extends IUser, Document {
}
export var UserSchema: Schema = new Schema({
username: String,
password: String,
email: String,
company: String,
});
export const User: Model<IUserDocument> = model<IUserDocument>("User", UserSchema);
//*/
mongoose.connect('mongodb://localhost:9100/mongodb-experiments');
User.find({}, function(err, users: IUserDocument[]){
console.log(users);
});
let message = colors.green('Hello') + ' ' + colors.red.bgYellow.underline('World') + ' ' + colors.blue.bgRed('!!!');
console.log(message);
// To work with the Mongo Shell:
// $ cd /path/to/mongodb/bin"
// $ mongo --port 9100
// use mongodb-experiments
// db.users.insert( { username: "bill.gates", password: "windows", email: "billgates@microsoft.com", company: "Microsoft" } )
// db.users.insert( { username: "steve.jobs", password: "mac", email: "stevejobs@apple.com", company: "Apple" } );
// db.getCollection("users").find()
. / Модели / user.ts
import { Document, Schema, Model, model} from "mongoose";
export interface IUser {
username: string,
password: string,
email: string,
company: string,
}
export interface IUserDocument extends IUser, Document {
}
export var UserSchema: Schema = new Schema({
username: String,
password: String,
email: String,
company: String,
});
export const User: Model<IUserDocument> = model<IUserDocument>("User", UserSchema);
Предположим, у нас есть фиктивные данные в базе данных:
$ cd /path/to/mongodb/bin"
$ mongo --port 9100
use mongodb-experiments
db.users.insert( { username: "bill.gates", password: "windows", email: "billgates@microsoft.com", company: "Microsoft" } )
db.users.insert( { username: "steve.jobs", password: "mac", email: "stevejobs@apple.com", company: "Apple" } );
Если я запускаю сервер с включенным [BLOCK 2]
:
$ ts-node server.ts
Я получаю следующий вывод:
Hello World !!!
[ { _id: 5b3561bbcde3135b908cb51b,
username: 'bill.gates',
password: 'windows',
email: 'billgates@microsoft.com',
company: 'Microsoft' },
{ _id: 5b3561c1cde3135b908cb51c,
username: 'steve.jobs',
password: 'mac',
email: 'stevejobs@apple.com',
company: 'Apple' } ]
Но если я запускаю сервер с включенным [BLOCK 1]
:
Я просто получаю следующий вывод:
Hello World !!!
без предыдущих записей.
Единственное различие, которое я вижу между обоими способами, заключается в том, где определяются интерфейсы, схема и модель.
РЕДАКТИРОВАТЬ 1
Я провел несколько экспериментов:
С way 1
и way 3
, упомянутыми выше, если я сделаю:
$ cd ./server/
$ tsc server.ts
$ node server.js
тогда я получаю ожидаемый результат .
Но с way 2
, упомянутым выше, если я сделаю:
$ cd ./server/
$ tsc server.ts
Я получаю следующий вывод:
node_modules/@types/mongoose/index.d.ts(61,9): error TS2300: Duplicate identifier 'NativeBuffer'.
node_modules/@types/mongoose/index.d.ts(62,9): error TS2300: Duplicate identifier 'NativeDate'.
node_modules/@types/mongoose/index.d.ts(63,9): error TS2300: Duplicate identifier 'NativeError'.
node_modules/@types/mongoose/index.d.ts(71,14): error TS2300: Duplicate identifier 'Mongoose'.
node_modules/@types/mongoose/index.d.ts(72,8): error TS2300: Duplicate identifier 'Mongoose'.
node_modules/@types/mongoose/index.d.ts(156,9): error TS2300: Duplicate identifier 'CastError'.
node_modules/@types/mongoose/index.d.ts(177,18): error TS2300: Duplicate identifier 'ConnectionBase'.
node_modules/@types/mongoose/index.d.ts(447,9): error TS2300: Duplicate identifier 'Connection'.
node_modules/@types/mongoose/index.d.ts(463,9): error TS2300: Duplicate identifier 'ValidationError'.
node_modules/@types/mongoose/index.d.ts(472,9): error TS2300: Duplicate identifier 'Error'.
node_modules/@types/mongoose/index.d.ts(562,9): error TS2300: Duplicate identifier 'VirtualType'.
node_modules/@types/mongoose/index.d.ts(579,9): error TS2300: Duplicate identifier 'Schema'.
node_modules/@types/mongoose/index.d.ts(888,5): error TS2374: Duplicate string index signature.
node_modules/@types/mongoose/index.d.ts(1018,5): error TS2374: Duplicate string index signature.
node_modules/@types/mongoose/index.d.ts(1072,13): error TS2300: Duplicate identifier 'MongooseDocument'.
node_modules/@types/mongoose/index.d.ts(1073,9): error TS2300: Duplicate identifier 'MongooseDocument'.
node_modules/@types/mongoose/index.d.ts(1275,11): error TS2300: Duplicate identifier 'Subdocument'.
node_modules/@types/mongoose/index.d.ts(1291,11): error TS2300: Duplicate identifier 'Array'.
node_modules/@types/mongoose/index.d.ts(1400,11): error TS2300: Duplicate identifier 'DocumentArray'.
node_modules/@types/mongoose/index.d.ts(1429,11): error TS2300: Duplicate identifier 'Buffer'.
node_modules/@types/mongoose/index.d.ts(1461,10): error TS2300: Duplicate identifier 'ObjectIdConstructor'.
node_modules/@types/mongoose/index.d.ts(1469,11): error TS2300: Duplicate identifier 'Decimal128'.
node_modules/@types/mongoose/index.d.ts(1475,11): error TS2300: Duplicate identifier 'Embedded'.
node_modules/@types/mongoose/index.d.ts(1515,9): error TS2300: Duplicate identifier 'Query'.
node_modules/@types/mongoose/index.d.ts(1516,9): error TS2300: Duplicate identifier 'DocumentQuery'.
node_modules/@types/mongoose/index.d.ts(1948,9): error TS2300: Duplicate identifier 'mquery'.
node_modules/@types/mongoose/index.d.ts(2000,13): error TS2300: Duplicate identifier 'Schema'.
node_modules/@types/mongoose/index.d.ts(2248,9): error TS2300: Duplicate identifier 'Aggregate'.
node_modules/@types/mongoose/index.d.ts(2411,9): error TS2300: Duplicate identifier 'SchemaType'.
node_modules/@types/mongoose/index.d.ts(2864,5): error TS2374: Duplicate string index signature.
node_modules/@types/mongoose/index.d.ts(2966,5): error TS2374: Duplicate string index signature.
Я думаю, что есть конфликты, потому что каталог: ./models/
имеет свой собственный каталог node_modules
.
Как вы думаете, есть ли способ НЕ включать зависимости:
{mongoose
, @types/mongoose
} в каталоге ./server/
и просто сделайте это в каталоге ./models/
, чтобы предотвратить эти конфликты?
Есть идеи, как заставить way 2
работать?
Спасибо!