如何在应用程序之间共享Mongoose Schema

时间:2016-11-14 17:33:53

标签: node.js mongodb mongoose mongoose-schema

我有一个具有以下结构的应用程序:

-MyApp
  -backend
    -app
      +mongoose-models
    +node_modules
    index.js
    package.json
  -admin
    +(lots of stuff)
  -frontend
    -app
      +app_controllers
    +node_modules
    +public
    +view
    index.js
    package.json

“backend”文件夹是“admin”的节点应用程序 “admin”是管理应用程序的公共文件夹,“frontend”是访问者将看到的网站。
我要做的是从“前端/ app / controller”上的控制器访问“后端”文件夹中的mongoose模式/模型。 我试过类似this的东西,但它没有解决我的问题。

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

我遇到了同样的挑战,故意想要拆分两个应用程序的代码库,但在数据库中共享一个架构。

从另一个应用程序的路径中要求模型的问题在于:

require('mongoose');

要求将在其他应用程序的node_modules中使用mongoose,在我的情况下,这甚至不是同一个版本。它不会抛出任何错误,但任何查询/更新/保存都不会执行回调。

我通过在应用程序的路径中强制要求mongoose模块来解决这个问题。

在应用程序开始时,添加此项以设置应用程序的基本目录:

global.__basedir = __dirname;

我知道使用全局变量是不受欢迎的,但我认为这是一个很好的例外。

然后在模型中,需要像这样的猫鼬:

var mongoose = require(global.__basedir + '/node_modules/mongoose');

全局.__ basedir的替代方法可以是在环境中设置应用程序的路径目录并使用它:

var mongoose = require(process.env.appdir + '/node_modules/mongoose');

答案 1 :(得分:1)

或者,您可以使用monorepo

来设置Lerna

您可以这样设置项目:

- MyApp:
  - models
    - ...
    - package.json
  - frontend
    - ...
    - package.json
  - backend
    - ...
    - package.json

frontendbackend内的任何地方,您都可以像

那样简单地导入模块
import {...} from '@myapp/models'