如何使用上下文在 Koa 中间件中传递参数?
How to pass a parameter in Koa middleware with context?
我正在使用 nodejs koa rest api 服务。我想将一个参数传递给验证中间件。
但我还需要传递上下文。
如何正确使用 koa2 的中间件
//route.js
const Router = require('koa-router')
const auth = require('../middlewares/auth')
const controller = require('../controllers').editorsController
const schemas = require('../schemas/joi_schemas')
const validation = require('../middlewares/validation')
const router = new Router()
const BASE_URL = `/editors`
router.get('/protected', auth, controller.protected)
router.get(BASE_URL, controller.getEditors)
router.post(BASE_URL, auth, validation(schemas.editorPOST, 'body'), controller.addEditor)
module.exports = router.routes()
//validation.js
const Joi = require('joi')
module.exports = (schema, property, ctx, next) => {
const { error } = Joi.validate(ctx.request[property], schema)
console.log(error)
const valid = error == null
if (valid) {
next()
} else {
const { details } = error
const message = details.map(i => i.message).join(',')
ctx.status = 422
ctx.body = {
status: 'error',
message: message
}
}
}
//joi_schemas.js
const Joi = require('joi')
const schemas = {
editorPOST: Joi.object().keys({
username: Joi.string().required(),
password: Joi.string().required(),
enable: Joi.number()
})
}
module.exports = schemas
我遇到一些错误:
无法读取未定义的 属性 'request'
或任何其他解决方案?
ctx.request
未定义,因为 ctx
未作为参数传递:
validation(schemas.editorPOST, 'body')
并且ctx
它在调用中间件的范围内不可用。
如果一个中间件需要参数化,它应该是高阶函数:
module.exports = (schema, property) => (ctx, next) => {
...
我正在使用 nodejs koa rest api 服务。我想将一个参数传递给验证中间件。
但我还需要传递上下文。
如何正确使用 koa2 的中间件
//route.js
const Router = require('koa-router')
const auth = require('../middlewares/auth')
const controller = require('../controllers').editorsController
const schemas = require('../schemas/joi_schemas')
const validation = require('../middlewares/validation')
const router = new Router()
const BASE_URL = `/editors`
router.get('/protected', auth, controller.protected)
router.get(BASE_URL, controller.getEditors)
router.post(BASE_URL, auth, validation(schemas.editorPOST, 'body'), controller.addEditor)
module.exports = router.routes()
//validation.js
const Joi = require('joi')
module.exports = (schema, property, ctx, next) => {
const { error } = Joi.validate(ctx.request[property], schema)
console.log(error)
const valid = error == null
if (valid) {
next()
} else {
const { details } = error
const message = details.map(i => i.message).join(',')
ctx.status = 422
ctx.body = {
status: 'error',
message: message
}
}
}
//joi_schemas.js
const Joi = require('joi')
const schemas = {
editorPOST: Joi.object().keys({
username: Joi.string().required(),
password: Joi.string().required(),
enable: Joi.number()
})
}
module.exports = schemas
我遇到一些错误:
无法读取未定义的 属性 'request'
或任何其他解决方案?
ctx.request
未定义,因为 ctx
未作为参数传递:
validation(schemas.editorPOST, 'body')
并且ctx
它在调用中间件的范围内不可用。
如果一个中间件需要参数化,它应该是高阶函数:
module.exports = (schema, property) => (ctx, next) => {
...