[Коа] 404 во время прохождения через Router - PullRequest
0 голосов
/ 22 октября 2018

У меня проблемы с каркасом Коа.Я пытаюсь построить довольно простой сервер, у меня проблемы с роутером.CTX всегда возвращает 404, несмотря на передачу моих функций.

Некоторый код:

//www.js
const Koa = require('koa');
const app = new Koa();
const version = require('./routes/version');

app.listen(config.port, () => {
  console.log('Server is listenning on port ' + config.port);
});

app.use(version.routes());
app.use(ctx => {
    console.log ('test')
});


//version.js
const Router = require('koa-router');
const router = new Router();
router.prefix('/version');

router.use((ctx, next) => {
  ctx.vFactory = new VersionFactory(ctx.app.db);
  next();
});

router.get('/', getAllVersions);

async function getAllVersions(ctx, next) {
  const ret = await ctx.vFactory.getAllVersions();
  ctx.body = JSON.stringify(ret.recordset);
  console.log(ctx.body)
  await next();
}

Я проверил несколько потоков.В большинстве случаев проблема возникает из-за функции, не основанной на Promise, в части ожидания функции маршрутизатора.Вот простой DAO, использующий mssql, основанный на обещаниях.

class DaoVersion {

    constructor(db) {
        this.pool = db;
    }
    async getAllVersions() {
        const me = this;
        return new Promise((resolve) => {
          const ret= me.pool
          .query(getVersion);

          resolve(ret);
        });
    }
}

Вывод на консоль выглядит неплохо.У меня есть ctx.body с данными моей базы данных, но если я пытаюсь проверить весь контекст, у меня все равно остается 404. Более интересно, если я пытаюсь ctx.res.write (используя ответ узла по умолчанию), я получаю "ужеконец "сообщение.Таким образом, кажется, что Коа послал сообщение, прежде чем передать мне свою функцию.

Есть идеи, почему и как я мог это исправить?

1 Ответ

0 голосов
/ 22 октября 2018

Код отклика по умолчанию для Koa - 404, в отличие от кода узла res.statusCode, который по умолчанию равен 200.

Код Koa изменяет код состояния по умолчанию на 200 - когда в наборе маршрутов непустое значение равно ctx.body илив некоторых случаях вы можете вручную изменить (например, если вам нужно установить его на 202) его с помощью ctx.status = xxx.

Вы можете использовать эту документацию для справки: https://github.com/koajs/koa/blob/master/docs/api/response.md

Кроме того, ваш маршрут должен быть асинхронной функцией:

router.get('/', async(ctx, next) => {

   ctx.body = await getAllVersions
   await next()
}
...