由於在 koa2中 關於 請求的函數 使用了async 和 await ,所以當 執行完數據庫操作之后,將返回的數據在回調函數中 賦值給 ctx.body 時,無法賦值。
在 async 函數內,使用await來執行異步操作,而await 會直接解析 Promise 的resolve 或者reject 中的值。對於有回調函數的操作,並不會被 async 等待,而直接執行,所以在回調函數中書寫的ctx.body = results 操作時 頁面已經返回,且並未獲取到數據庫返回的值。所以頁面會顯示notFOUND。
解決方法是 將 query 函數外部包含一個 new Promise 函數,通過promise 來 resolve (results),來配合await 操作完成 異步操作。而 async 與 await 的作用是為了將異步操作轉換為同步操作,所以 ctx.body 賦值 操作 可以寫在 await 操作后邊。這樣就可以成功返回正確的數據。
const connection = require('./mysql');
const query = function (sql,arg) {
return new Promise((resolve, reject) => {
connection.query(sql, arg, function (error, results) {
if(error){
reject(error);
}else{
resolve(results)
}
});
})
}
var fn_hello = async (ctx, next) => { var name = ctx.params.name; let results = await query('SELECT * FROM first_grade WHERE grade_age=?',[12]); ctx.response.body = env.render('hello.html', { name: name, age: 12, data: results }); };
這樣就成功了。
