所以我们刚开始将后端应用程序解构为更小的模块,并使用angular/cli
解决了这个问题。
我有几个npm模块,其中一个保存接口到我们的mongoose
模型,我们称之为app/models
。
我们有一个回复用于后端,一个用于管理员,用Angular 2编写。当试图在2之间共享模型定义时,有关mongoose.model
的角度抱怨不是函数。作为一个小例子,这就是我们放置文件的方式
backend
api
get_blog_posts.ts
angular2
post-editor.ts
app/models
index.ts
/schemas
blog_post.ts
/models
blog_posts.ts
/schemas/blog_posts.ts
导出我们要在Angular 2
app
export interface BlogPostSchema {...}
/models/blog_posts.ts
导出BlogPostModel
这是一个基本的mongoose
模型,如下所示:
import {BlogPostSchema} from '../schemas/blog_post'
const Schema = new mongoose.Schema({...})
export const BlogPostModel = mongoose.model<BlogPostSchema>('BlogPost', Schema, 'blog_posts')
index.ts
导出这两个:
export {BlogPostSchema} from './schemas/blog_posts'
export {BlogPostModel} from './models/blog_posts'
在Angular 2应用程序中,我们像这样使用BlogPostSchema
:
import {BlogPostSchema} from 'app/models' // app/models is installed as an npm module
@Component({...})
export class BlogPostEditorComponent {
postItems: BlogPostSchema[];
}
在我们的后端应用程序上尝试相同的操作时,一切都运行正常,但是,在使用angular/cli
构建的Angular 2中,我们收到错误:
TypeError: mongoose.model is not a function
at Object.Array.concat.Object.defineProperty.value (blog_post.ts?58c8*:70)
at __webpack_require__ (bootstrap b8ea1f1…:52)
at Object.Array.concat.Object.defineProperty.value (index.ts?adf0*:2)
at __webpack_require__ (bootstrap b8ea1f1…:52)
at Object.Array.concat.webpackEmptyContext.keys (index.ts?f9f5*:2)
at __webpack_require__ (bootstrap b8ea1f1…:52)
at Object.<anonymous> (index.ts:22)
我们不想在Angular 2应用中使用BlogPostModel
,我们只需要接口BlogPostSchema
。
请注意,服务器和app/models
模块是用TypeScript
编写的。在编译模块时的设置中,这两个是 - 我认为 - 最重要的领域:
"compilerOptions": {
"module": "commonjs",
"target": "es5",
}