2017-04-13 5 views
0

背景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') 

コードは次のようにしている私のカスタムミドルウェアによるものです。

誰でもこのミドルウェアに何が問題なのか教えてください。

+0

を理解しよう。 –

答えて

0

あなたの問題は./db/data-fetcher.jsです。あなたが呼び出しているとき

let r = await df(`insert ....`) 

df - 関数は約束を返す必要があります。

ので(テストされていない)、このようなあなたの./db/data-fetcher.jsを書き換えるしよう:

const query = require('./async-db') 

function performQuery(sql) { 
    return new Promise((resolve, reject) => { 
     query(sql).then(
      result => { 
       resolve(result) 
      } 
     ) 
    } 
} 

module.exports = performQuery; 

お役に立てば幸いです。

+0

こんにちは、ありがとうございます。しかし、それでもまだ "Not found"が返されます –

+0

あなたの '。/ router/gateway.js'に' let r = await df(...) 'の後に' return ctx.body = {...}。ここでは 'ctx.body = {' ...でなければなりません。 –

0

正しいミドルウェア:

function log(ctx) { 
    console.log(ctx.method, ctx.header.host + ctx.url) 
} 

module.exports = function() { 
    return function (ctx, next) { 
     log(ctx); 
     return next() 
    } 
} 

理由:resolveが関与。 promise chain was completed;応答がクライアントに送信されました。ミドルウェアは残っていますが、応答はなくなりました!

は、ルートの終わり)(次の呼び出してみIt seems that if you want to use a common function as middleware, you have to return the next function

nodejs(koa):Can't set headers after they are sent

関連する問題