在 Mongoose 和 Joi 之间只维护一个模式的最佳方法

Best way to maintain only one schema between Mongoose and Joi

我正在使用 Hapi 开发 Web 服务,使用 Mongoose 作为 ODM,使用 Joi 作为验证器。 我真的很喜欢 Joi 的验证以及它与 HAPI 的连接方式(我需要 Joi 的描述函数来大摇大摆地显示一些描述)但我不想维护两个模式,一个用于 Joi,一个用于 mongoose;我想使用 Joi 定义我的架构,然后能够仅导出 Mongoose 所需的基本架构。例如:

mySchema.js

module.exports = {
    name : String,
    address: String
}

myValidator.js

module.exports = {
    payload: {
        name: Joi.description('A name').string().required(),
        address: Joi.description('An address').string()
    }
}

myModel.js

const mongoose = require('mongoose'),
    mySchema = require('./mySchema');

var schemaInstance = new mongoose.Schema(mySchema),
    myModel = mongoose.model('myModel', schemaInstance);

myHapiRoute.js

const myValidator = require('./myValidator.js'),
    myController = require('./myController.js');

...

{
    method: 'POST',
    path: '/create',
    config: {
        description: 'create something',
        tags: ['api'],
        handler: myController,
        validate: myValidator
    }
}
...

我想避免维护mySchema.js文件的麻烦完全来自Joi的模式。

关于如何做或任何不同的方法有什么建议吗?

为此,您可以使用 Joigoose 将 Joi 模式转换为 Mongoose 模式,如下例所示:

const mongoose = require('mongoose')
const joi = require('joi')
const joigoose = require('joigoose')(mongoose)

const joiSchema = joi.object().keys({
  name: joi.description('A name').string().required(),
  address: joi.description('An address').string()
})

const mongooseSchema = new mongoose.Schema(joigoose.convert(joiSchema))

mongose.model('Model', mongooseSchema)