koa2 ctx.body 在 mysql query的回調函數中無法賦值。


由於在 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 });
};

這樣就成功了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM