背景koa2 + KOA-ルータ+ mysqlの私は、基本的なAPIフレームワークを構築するために、いくつかのミドルウェアを使用していますkoa2
'が見つかりませんでした' 戻っておきます。私は私のルータの応答を送信するために "ctx.body" を使用する場合でも、クライアント側は常に受信
私のコード
./app.js
const Koa = require('koa');
const app = new Koa();
const config = require('./config');
//Middlewares
const loggerAsync = require('./middleware/logger-async')
const bodyParser = require('koa-bodyparser')
const jsonp = require('koa-jsonp')
app.use(loggerAsync())
app.use(bodyParser())
app.use(jsonp());
//Router
const gateway = require('./router/gateway')
app.use(gateway.routes(), gateway.allowedMethods());
app.use(async(ctx, next) => {
await next();
ctx.response.body = {
success: false,
code: config.code_system,
message: 'wrong path'
}
});
app.listen(3000);
"見つかりません"。そして/router/gateway.js
/**
* Created by Administrator on 2017/4/11.
*/
const Router = require('koa-router');
const gateway = new Router();
const df = require('../db/data-fetcher');
const config = require('../config');
const moment = require('moment');
const log4js = require('log4js');
// log4js.configure({
// appenders: { cheese: { type: 'file', filename: 'cheese.log' } },
// categories: { default: { appenders: ['cheese'], level: 'error' } }
// });
const logger = log4js.getLogger('cheese');
logger.setLevel('ERROR');
gateway.get('/gateway', async(ctx, next) => {
let time = ctx.query.time;
if (!time) {
ctx.body = {
success: false,
code: config.code_system,
message: 'Please input running times'
}
} else {
try {
let r = await df(`insert into gateway (g_time, g_result, g_date) values (${time}, '',now())`);
return ctx.body = {
success: true,
code: config.code_success
}
} catch (error) {
logger.error(error.message);
}
}
});
module.exports = gateway;
デシベルラッパー(MySQLの)
は
const mysql = require('mysql');
const config = require('../config');
const pool = mysql.createPool({
host: config.database.HOST,
user: config.database.USERNAME,
password: config.database.PASSWORD,
database: config.database.DATABASE
})
let query = (sql, values) => {
return new Promise((resolve, reject) => {
pool.getConnection(function (err, connection) {
if (err) {
reject(err)
} else {
connection.query(sql, values, (err, rows) => {
if (err) {
reject(err)
} else {
resolve(rows)
}
connection.release()
})
}
})
})
}
module.exports = query
./db/async-db.js ./db/data-fetcher.js
const query = require('./async-db')
async function performQuery(sql) {
let dataList = await query(sql)
return dataList
}
module.exports = performQuery;
私のランニング結果
私は、ポート3000上のサーバーを起動するとhttp://localhost:3000/gateway?time=5を介してアクセスすると、常に「見つかりません」が返されます。しかし私が見ることができるように私は既に使用している
return ctx.body = {
success: true,
code: config.code_success
}
応答を送信する。私はデバッグし、データベースの処理がうまくいっていることを発見しました。新しいデータがうまく挿入されました。
DB挿入行を削除すると正常に動作し、成功情報を返します。
let r = await df(`insert into gateway (g_time, g_result, g_date) values (${time}, '',now())`);
間違いがありますか?
ありがとうございます!
アップデート2017年4月27日
今私は問題を発見しました。私は/道そして、すべてがうまく機能している待つ非同期にそれを変更し
function log(ctx) {
console.log(ctx.method, ctx.header.host + ctx.url)
}
module.exports = function() {
return function (ctx, next) {
return new Promise((resolve, reject) => {
// 执行中间件的操作
log(ctx)
resolve()
return next()
}).catch((err) => {
return next()
})
}
}
- それは
const loggerAsync = require('./middleware/logger-async')
コードは次のようにしている私のカスタムミドルウェアによるものです。
誰でもこのミドルウェアに何が問題なのか教えてください。
を理解しよう。 –