2017-08-14 31 views
0

我的任務是使用對象關係映射(ORM)爲類創建一個小型應用程序。這是一個相當簡單的應用程序,它接受客戶端輸入,將其放入數據庫並顯示回客戶端。請將回調函數的事件路徑分解爲ORM文件

但是,由於我們在3個文件之間傳遞代碼,所以我很難理解正在發生的事情。有一個burgers-controller.js文件需要burgers.js文件,該文件需要orm.js文件。對於想要查看完整代碼的人,您可以在我的Github上找到它。

我得到了使用ORM並模塊化一切的推理和好處,但我需要有人來分解代碼內部發生的事情以及按照什麼順序。

所以在burgers-controller.js文件中我們有以下代碼。

router.get("/", (req, res)=>{ 

    burgers.selectAll((result)=>{ 
    let handlebarsObj = { 
     burgers: result 
    } 
    res.render("index", handlebarsObj) 
    }); 
}) 

然後在burgers.js裏面我們有下面的代碼。

let burgers = { 
    selectAll: (callback)=>{ 
    orm.selectAll("burgers", (result)=>{ 
     callback(result); 
    }) 
    } 
} 

最後在orm.js我們有。

let orm = { 

    selectAll: (tableName, callback)=>{ 
    let queryString = "SELECT * FROM ??" 

    connection.query(queryString, tableName, (err, data)=>{ 
     if (err){console.error("ERROR: " + err.stack)} 
     callback(data) 
    }) 
    } 
} 

ORM文件連接到MySQL數據庫。

你能解釋一下這裏發生了什麼,以什麼順序?

回答

0

我想我明白了,雖然它在黑暗中拍攝,因爲在您的描述中沒有指示實際的錯誤。如果我犯了錯誤,請原諒我。

發送到burgers.selectAll(burgers-controller.js的回撥在burgers.js內執行。當它在burgers.js之內執行而不在burgers-controller.js之內時,它不會訪問res對象,該對象只出現在burgers-controller.js中。

我們可以用promise來解決問題。我要在這裏使用原生一個,但你可以自由地使用任何其他包(如:bluebird):

// burgers-controller.js 
router.get('/', (req, res)=> { 
    burgers 
     .selectAll() 
     .then((result) => { 
      let handlebarsObj = { 
       burgers: result 
      } 
      res.render('index', handlebarsObj) 
     }) 
}) 

// burgers.js 
let burgers = { 
    selectAll:() => { 
     return new Promise((resolve, reject) => { 
      orm.selectAll('burgers', (result) => { 
       resolve(result) 
      }) 
     }) 
    } 
} 

您可以在任何地方使用的承諾是處理故障更優雅:

// burgers-controller.js 
router.get('/', (req, res)=> { 
    burgers 
     .selectAll() 
     .then((result) => { 
      let handlebarsObj = { 
       burgers: result 
      } 
      res.render('index', handlebarsObj) 
     }) 
     .catch((err) => { 
      let errMsg = { 
       message: err.message, 
       error: err 
      } 
      res.render('index', errMsg) 
     }) 
}) 

// burgers.js 
let burgers = { 
    selectAll:() => { 
     return new Promise((resolve, reject) => { 
      orm 
       .selectAll('burgers') 
       .then((result) => { 
        resolve(result) 
       }) 
       .catch((err) => { 
        reject(err) 
       }) 
     }) 
    } 
} 

// orm.js 
let orm = { 
    selectAll: (tableName) => { 
     return new Promise((resolve, reject) => { 
      let queryString = "SELECT * FROM ??" 

      connection.query(queryString, tableName, (err, data)=>{ 
       if (err) { 
        console.error("ERROR: " + err.stack) 
        reject(err) 
       } else { 
        resolve(data) 
       } 
      }) 
     }) 
    } 
}