我在Koa框架上遇到了一些麻烦。我通过路由器遇到问题,试图构建一个非常基本的服务器。尽管传递了我的函数,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();
}
我检查了几个线程。在大多数情况下,问题似乎来自路由器功能的await部分中基于非Promise的功能。这是一个使用mssql的简单DAO,它是基于Promise的。
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(使用默认节点响应),则“已经”结束”消息。因此,似乎Koa已在传递传递我的函数之前发送了消息。
有什么主意,为什么以及如何纠正呢?
答案 0 :(得分:0)
Koa默认的response.status代码为404,这与节点的res.statusCode默认为200不同。
Koa将默认状态码更改为200-当您的路由设置为ctx.body的非空值时,或者在某些情况下,您可以使用ctx.status =手动更改(例如,如果需要将其设置为202) xxx。
您可以使用此文档作为参考:https://github.com/koajs/koa/blob/master/docs/api/response.md
此外,您的路由应为异步功能:
router.get('/', async(ctx, next) => {
ctx.body = await getAllVersions
await next()
}