Как передать параметр в промежуточное ПО Koa с контекстом? - PullRequest
0 голосов
/ 21 апреля 2019

Я использую сервис 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' из неопределенного

Или любые другие решения?

1 Ответ

0 голосов
/ 21 апреля 2019

ctx.request не определено, поскольку ctx не было передано в качестве аргумента:

validation(schemas.editorPOST, 'body')

и ctx недоступно в области, где было вызвано промежуточное программное обеспечение.

Если промежуточное программное обеспечение должно быть параметризовано, оно должно быть функцией более высокого порядка:

module.exports = (schema, property) => (ctx, next) => {
 ...
...