15

我正在使用 Hapi 开发 Web 服务,Mongoose 作为 ODM,Joi 作为验证器。我真的很喜欢 Joi 的验证以及它与 HAPI 连接的方式(我需要 Joi 的描述函数来大摇大摆地显示一些描述),但我不想维护两种模式,一种用于 Joi,一种用于猫鼬;我想使用 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 的模式生成它的麻烦。

关于如何做到这一点或任何不同的方法的任何建议?

4

1 回答 1

9

对于这个问题,您可以使用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)
于 2018-02-08T17:04:08.273 回答