2017-10-12 54 views
-1

我是新來的javascript後端,我目前正在學習使用node.js,express.js,sequelize.js和MySQL作爲我的數據庫來構建一個RESTful API。我已經成功構建了基本的Tasks API作爲測試。我正在尋找反饋,看看我是否正確地做到了這一點,只要在一個控制器中使用JavaScript最佳實踐即可。任何反饋將不勝感激。查看我的API控制器

當前邏輯:用戶可以擁有多個任務

一切工作正常。我正在使用Passport.js中的JWT策略對用戶進行身份驗證。我在路由器級驗證它們,然後在允許更新或刪除它們自己的記錄之前,通過userid在db中對它們的記錄進行雙重檢查。不管怎麼說,這裏是控制器:

'use strict'; 

var jwt = require('jsonwebtoken'); 

var config = require('../config'), 
    db = require('../services/database'), 
    Task = require('../models/task'); 

var TaskController = {}; 

// GET ALL Tasks 
TaskController.get = function (req, res) { 
    if (!req.user.id) { 
     res.json({ message: 'You are not authorized.' }); 
    } else { 
     db.sync().then(function() { 
      return Task.findAll({ where: { userid: req.user.id } }).then(function (result) { 
       res.status(202).json(result); 
      }); 
     }); 
    } 
} 

// POST ONE Task 
TaskController.post = function (req, res) { 
    if (!req.body.task) { 
     res.json({ message: 'Please provide a task to post.' }); 
    } else { 
     db.sync().then(function() { 
      var newTask = { 
       userid: req.user.id, 
       task: req.body.task 
      }; 

      return Task.create(newTask).then(function() { 
       res.status(201).json({ message: 'Task Created!' }); 
      }); 
     }); 
    } 
} 

// PUT ONE Task 
TaskController.put = function (req, res) { 
    if (!req.body.task) { 
     res.json({ message: 'Please provide a task to update.' }); 
    } else { 
     db.sync().then(function() { 
      // Find task by task id and user id 
      Task.find({ where: { id: req.params.id, userid: req.user.id } }) 
       .then(function (task) { 
        // Check if record exists in db 
        if (task) { 
         task.update({ 
          task: req.body.task 
         }).then(function() { 
          res.status(201).json({ message: 'Task updated.' }); 
         }); 
        } else { 
         res.status(404).json({ message: 'Task not found.' }); 
        } 
       }); 
     }); 
    } 
} 

// DELETE ONE Task 
TaskController.delete = function (req, res) { 
    if (!req.params.id) { 
     res.json({ message: 'Please provide a task to delete.' }); 
    } else { 
     db.sync().then(function() { 
      Task.find({ where: { id: req.params.id, userid: req.user.id } }) 
       .then(function (task) { 
        if (task) { 
         task.destroy({ where: { id: req.params.id } }) 
          .then(function() { 
           res.status(202).json({ message: 'Task deleted.' }); 
          }); 
        } else { 
         res.status(404).json({ message: 'Task not found.' }); 
        } 
       }); 
     }); 
    } 
} 

module.exports = TaskController; 
+1

Stack Overflow不是代碼審查平臺。這裏不要問這樣的問題。您可以在此頁面的底部找到代碼審查堆棧交換。你應該刪除這個問題並且在那裏問。 – Rob

+0

這是一個題外話題?我要求有經驗的程序員檢查我的代碼並指出我可能犯的任何錯誤。如果這不是正確的平臺,那麼請提出一些你喜歡的建議。謝謝 –

+0

您正在徵求意見的反饋意見和最佳實踐。你不會問你說過的代碼中的錯誤。這些都是脫節主題,如幫助中心中所述。 – Rob

回答

1

TaskController.js看起來不錯,但我會建議將所有的ORM邏輯(Sequelize)到一個名爲TaskService.js

示例 -

TaskService.js -

... 

exports.delete = function() { 
    db.sync().then(function() { 
     Task.find({ where: { id: req.params.id, userid: req.user.id } }) 
      .then(function (task) { 
       if (task) { 
        task.destroy({ where: { id: req.params.id } }) 
         .then(function() { 
          res.status(202).json({ message: 'Task deleted.' }); 
         }); 
       } else { 
        res.status(404).json({ message: 'Task not found.' }); 
       } 
      }); 
    }); 
} 

然後在TaskController.js -

... 

const TaskService = require('./TaskService); 

... 

TaskController.delete = function(req, res) { 
    if (!req.params.id) { 
     res.json({ message: 'Please provide a task to delete.' }); 
    } else { 
     TaskService.delete(); 
    } 
} 
+1

請不要回答主題問題。回答良好的問題 並非所有的問題都可以或應該在這裏得到解答。保存自己的一些挫折感,並避免試圖回答以下問題...... ...不清楚或缺乏可以唯一識別問題的具體細節。 ...徵求意見而非事實。「https:// stackoverflow。com/help /如何回答 – Rob

1

有一兩件事我想盡可能的Javascript最佳做法將被嵌套的承諾召喚出來,這是一個有點反模式的。當你嵌套它們時,你失去了承諾鏈的力量,實際上創造了嵌套的回調。一旦開始嘗試使用.catch()塊進行錯誤處理,情況就會變得很奇怪。快速重構與catch塊可能是這樣的,即使這是基於條件的,因爲仍然凌亂的任務是否在數據庫中存在:

// PUT ONE Task 
TaskController.put = function (req, res) { 
    if (!req.body.task) { 
    res.json({ message: 'Please provide a task to update.' }); 
    } else { 
    db.sync() 
     .then(function() { 
     // Find task by task id and user id 
     // NOTE: we return the promise here so that we can chain it 
     // to the main promise chain started by `db.sync()` 
     return Task.find({ where: { id: req.params.id, userid: req.user.id } }); 
     }) 
     .then(function (task) { 
     // Check if record exists in db 
     if (task) { 
      task.update({ task: req.body.task }) 
      .then(function() { 
      res.status(201).json({ message: 'Task updated.' }); 
      }) 
      .catch(function (updateError) { 
      // do something with your update error 
      // catches an error thrown by `task.update()` 
      }); 
     } else { 
      res.status(404).json({ message: 'Task not found.' }); 
     } 
     }) 
     .catch(function (promiseChainError) { 
     // do something with your promiseChainError 
     // this catch block catches an error thrown by 
     // `db.sync()` and `Task.find()` 
     }); 
    } 
} 

或者,如果你更舒服同步樣式代碼,並有更新的節點版本V7 +的選擇,這是你的職責是什麼樣子使用異步/ AWAIT:

// PUT ONE Task 
TaskController.put = async function (req, res) { 
    if (!req.body.task) { 
    res.json({ message: 'Please provide a task to update.' }); 
    } else { 
    try { 
     await db.sync(); 
     const task = await Task.find({ where: { id: req.params.id, userid: req.user.id } }); 

     // Check if record exists in db 
     if (task) { 
     await task.update({ task: req.body.task }); 
     res.status(201).json({ message: 'Task updated.' }); 
     } else { 
     res.status(404).json({ message: 'Task not found.' }); 
     } 
    } catch (error) { 
     // do some something with your error 
     // catches all errors thrown by anything in the try block 
    } 
    } 
} 

有大量的資源在那裏大約承諾鏈和處理異步方法。特別檢查這一項:http://solutionoptimist.com/2013/12/27/javascript-promise-chains-2/

+0

請不要回答主題問題。回答良好的問題 並非所有的問題都可以或應該在這裏得到解答。保存自己的一些挫折感,並避免試圖回答以下問題...... ...不清楚或缺乏可以唯一識別問題的具體細節。 ...徵求意見而非事實。「https://stackoverflow.com/help/how-to-answer – Rob