升级 Joi 至最新版本后出现错误 - Schema 只能包含普通对象 (名称)

8

将Joi升级到最新版本@hapi/Joi(17.1.1)后,我的服务器无法启动,在启动时出现以下错误。最近的版本中似乎有一些破坏性变化。目前还没有找到任何线索,感谢任何帮助。

Error: Schema can only contain plain objects (name)
    at new module.exports (/Users/xyz/project/projectxyz/node_modules/@hapi/hoek/lib/error.js:23:19)
    at module.exports (/Users/xyz/project/projectxyz/node_modules/@hapi/hoek/lib/assert.js:20:11)
    at Object.internals.schema (/Users/xyz/project/projectxyz/node_modules/@hapi/joi/lib/compile.js:88:5)
    at Object.exports.schema (/Users/xyz/project/projectxyz/node_modules/@hapi/joi/lib/compile.js:17:26)
    at internals.Base.$_compile (/Users/xyz/project/projectxyz/node_modules/@hapi/joi/lib/base.js:631:24)
    at /Users/xyz/project/projectxyz/node_modules/@hapi/joi/lib/types/keys.js:255:92
    at Object.exports.tryWithPath (/Users/xyz/project/projectxyz/node_modules/@hapi/joi/lib/common.js:173:16)
    at internals.Base.method [as keys] (/Users/xyz/project/projectxyz/node_modules/@hapi/joi/lib/types/keys.js:255:32)
    at Object.internals.schema (/Users/xyz/project/projectxyz/node_modules/@hapi/joi/lib/compile.js:90:25)
    at Object.exports.schema (/Users/xyz/project/projectxyz/node_modules/@hapi/joi/lib/compile.js:17:26)
    at Object.exports.compile (/Users/xyz/project/projectxyz/node_modules/@hapi/joi/lib/compile.js:117:24)
    at Object.compile (/Users/xyz/project/projectxyz/node_modules/@hapi/joi/lib/index.js:123:24)
    at Object.exports.compile (/Users/xyz/project/projectxyz/node_modules/@hapi/hapi/lib/validation.js:49:22)
    at module.exports.internals.Route._setupValidation (/Users/xyz/project/projectxyz/node_modules/@hapi/hapi/lib/route.js:197:43)
    at new module.exports.internals.Route (/Users/xyz/project/projectxyz/node_modules/@hapi/hapi/lib/route.js:122:14)
    at internals.Server._addRoute (/Users/xyz/project/projectxyz/node_modules/@hapi/hapi/lib/server.js:498:23)
    at internals.Server.route (/Users/xyz/project/projectxyz/node_modules/@hapi/hapi/lib/server.js:491:22)
    at /Users/xyz/project/projectxyz/src/app.js:73:14
    at Array.forEach (<anonymous>)
    at init (/Users/xyz/project/projectxyz/src/app.js:72:17)
    at processTicksAndRejections (internal/process/task_queues.js:97:5)
    at process.runNextTicks [as _tickCallback] (internal/process/task_queues.js:66:3) {
  path: 'name'
} Server Init error Error: Schema can only contain plain objects (name)
    at new module.exports (/Users/xyz/project/projectxyz/node_modules/@hapi/hoek/lib/error.js:23:19)
    at module.exports (/Users/xyz/project/projectxyz/node_modules/@hapi/hoek/lib/assert.js:20:11)
    at Object.internals.schema (/Users/xyz/project/projectxyz/node_modules/@hapi/joi/lib/compile.js:88:5)
    at Object.exports.schema (/Users/xyz/project/projectxyz/node_modules/@hapi/joi/lib/compile.js:17:26)
    at internals.Base.$_compile (/Users/xyz/project/projectxyz/node_modules/@hapi/joi/lib/base.js:631:24)
    at /Users/xyz/project/projectxyz/node_modules/@hapi/joi/lib/types/keys.js:255:92
    at Object.exports.tryWithPath (/Users/xyz/project/projectxyz/node_modules/@hapi/joi/lib/common.js:173:16)
    at internals.Base.method [as keys] (/Users/xyz/project/projectxyz/node_modules/@hapi/joi/lib/types/keys.js:255:32)
    at Object.internals.schema (/Users/xyz/project/projectxyz/node_modules/@hapi/joi/lib/compile.js:90:25)
    at Object.exports.schema (/Users/xyz/project/projectxyz/node_modules/@hapi/joi/lib/compile.js:17:26)
    at Object.exports.compile (/Users/xyz/project/projectxyz/node_modules/@hapi/joi/lib/compile.js:117:24)
    at Object.compile (/Users/xyz/project/projectxyz/node_modules/@hapi/joi/lib/index.js:123:24)
    at Object.exports.compile (/Users/xyz/project/projectxyz/node_modules/@hapi/hapi/lib/validation.js:49:22)
    at module.exports.internals.Route._setupValidation (/Users/xyz/project/projectxyz/node_modules/@hapi/hapi/lib/route.js:197:43)
    at new module.exports.internals.Route (/Users/xyz/project/projectxyz/node_modules/@hapi/hapi/lib/route.js:122:14)
    at internals.Server._addRoute (/Users/xyz/project/projectxyz/node_modules/@hapi/hapi/lib/server.js:498:23)
    at internals.Server.route (/Users/xyz/project/projectxyz/node_modules/@hapi/hapi/lib/server.js:491:22)
    at /Users/xyz/project/projectxyz/src/app.js:73:14
    at Array.forEach (<anonymous>)
    at init (/Users/xyz/project/projectxyz/src/app.js:72:17)
    at processTicksAndRejections (internal/process/task_queues.js:97:5)
    at process.runNextTicks [as _tickCallback] (internal/process/task_queues.js:66:3) {
  path: 'name'
}

1
我能看一下你的模式代码和模型导出吗? - Badri Derakhshan
4个回答

4

对于那些再次陷入这个黑暗境地的人,对我来说,这是在使用扩展运算符扩展Joi模式时出现的问题:

joi.object().keys({
   ...otherSchema,
   position: joi.number()
})

当我升级到Joi 17.5.0时,这导致了“Schema can only contain plain objects”错误。使用keys()语法解决了这个问题:

otherSchema.keys({
   position: joi.number()
})

1

感谢大家的评论。在阅读Joi的发布说明后,我成功地解决了这个问题。

问题出在Joi版本混合使用上。我的代码库中使用了较旧的Joi版本,导致了这个问题。下面的Github问题帮助我意识到了这个问题。

https://github.com/hapijs/joi/issues/1913


0

没有看到代码很难说。
但是我在使用 Joi.extend() 时遇到了相同的问题。

const extendedType = Joi.extend(Joi => {
  return {
    type: 'myType', // <- PAY ATTENTION
    base: Joi.array(),
    messages: {
      'stringArray:base': '...'
    },
    validate(value, helpers) {
      ...
    },
    coerce(value, helpers) {
      ...
    }
  }
});

问题在于我错误地使用了以下代码:

extendedType


Joi.object({
  someKey: extendedType,
  ...
});

改为:

Joi.object({
  someKey: extendedType.myType(),
  ...
});

0

我认为你应该像这样处理这个错误:

    var ObjectJoi = Joi.object({
    //some item that you want to add

})

var mySchema = new Schema(Joigoose.convert(ObjectJoi))
const myModel = mongoose.model('myModel', mySchema);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接