2017-08-14 4 views
0

クラス用にオブジェクトリレーショナルマッピング(ORM)を使用して小さなアプリケーションを作成することになっていました。これは非常にシンプルなアプリケーションで、クライアント側の入力を受け取り、データベースに配置し、クライアントに表示します。コールバック関数のイベントパスをORMファイルに分解してください。

しかし、私は3つのファイル間でコードを渡す際に何が起こっているのかを理解するのに苦労しています。ファイルburgers.jsが必要なファイルburgers-controller.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-controller.jsからburgers.selectAll(に送信されるコールバックはburgers.jsの内部で実行されます。 burgers.jsの内部で実行され、burgers-controller.jsに含まれていない場合、burgers-controller.jsにのみ存在するresオブジェクトにアクセスできません。

約束を使用して問題を解決できます。私はここでネイティブのいずれかを使用するつもりですが、あなたは他のパッケージ自由に使用できます(例:bluebird):

// 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) 
       } 
      }) 
     }) 
    } 
} 
:あなたはどこにでも約束を使用することができます
// 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) 
      }) 
     }) 
    } 
} 

は、より優雅に障害との契約があるが
関連する問題