@Slava191

Как получить ctx.state.user перед router в Koa?

Суть такая, есть класс обертка над операциями mongoose, хочу инициализировать инстанс данного класса перед маршрутами, чтоб не делать это каждый раз в каждом маршруте. Всю голову сломал как это сделать.

То бишь есть такое:

const Wall = require('../models/wall.js');
const WorkWithModels = require('../models/workWithModels.js');

exports.post = async (ctx, next) => {
 const w = new WorkWithModels(Wall, ctx)
 //операции post
}

exports.delete = async (ctx, next) => {
 const w = new WorkWithModels(Wall, ctx)
 //операции delete
}

exports.get = async (ctx, next) => {
 const w = new WorkWithModels(Wall, ctx)
 //операции get
}


Хочу придти к такому:

const Wall = require('../models/wall.js');
const WorkWithModels = require('../models/workWithModels.js');

const w = new WorkWithModels(Wall, ctx) //как же получить тут ctx??
//м.б. во что-нибудь обернуть данную конструкцию где определен ctx, но ничего путного не выходит(

exports.post = async (ctx, next) => {
 //операции post
}

exports.delete = async (ctx, next) => {
 //операции delete
}

exports.get = async (ctx, next) => {
 //операции get
}
  • Вопрос задан
  • 141 просмотр
Решения вопроса 1
@Slava191 Автор вопроса
Я решил проблему следующим образом. Прошу опытных ребят, подсказать насколько это удачная/неудачная реализация?

Код в index.js

const Koa = require('koa');
const app = new Koa();

const router = new Router();

require('./routes/wall')(app, router)

...


module.js

const Wall = require('../models/wall.js');
const WorkWithModels = require('../models/workWithModels.js');

module.exports = (app, router) => {

    let w
    
    app.use(async (ctx, next) => {
        w = new WorkWithModels(Wall, ctx)
        await next()
    });

   router
        .get('....', async (ctx, next) => {
              //можно работать с экземпляром класса WorkWithModels
         })
         .post(...)
         .delete(...)
    
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы