node.js + Express - 如何正确抛出/捕获错误

时间:2016-09-18 16:45:01

标签: javascript node.js error-handling

我刚刚使用Express启动了一个项目,我对node.js一无所知,甚至在Javascript中也没有。我想知道什么是投掷和捕获错误的正确方法,以便它们正确显示,并且我不会复制太多代码。我在app.js中想到了这段代码:

<ul>
<% @users.each do |user| %>
  <% if current_user == user || current_user.friends.include?(user) %>
    <li><%= link_to user.email, user_path(user) %></li>
  <% else %>
    <% if current_user.friend_requests.pluck(:friend_id).include? user.id %>
      <li><%= link_to user.email, user_path(user) %> 
          | Pending Request</li> 
    <% else %>
      <li><%= link_to user.email, user_path(user) %> |
      <%= link_to "Add Friend", friend_requests_path(friend_id: user.id), method: :post %>
      </li>   
    <% end %>
  <% end %>
<% end %>
</ul>

就像一个巨大的捕获,它将拦截我将在控制器中抛出的所有错误。但我真的不知道如何让它发挥作用。例如,让我们在users.js中使用这段代码:

    placesClient = GMSPlacesClient.sharedClient()
    resultsViewController = GMSAutocompleteResultsViewController()
    resultsViewController?.delegate = self
    searchController = UISearchController(searchResultsController: resultsViewController)
    searchController?.searchResultsUpdater = resultsViewController

    searchController?.searchBar.sizeThatFits(CGSize(width: 600, height: 44.0 ))


         self.definesPresentationContext = true

    searchController?.searchBar.frame = (CGRectMake(0, 100,600, 44.0))

    self.navigationItem.rightBarButtonItem = UIBarButtonItem(customView: (searchController?.searchBar)!)

    // Keep the navigation bar visible.
    searchController?.hidesNavigationBarDuringPresentation = false
    searchController?.modalPresentationStyle = UIModalPresentationStyle.Popover
  • 如何发送类似204代码(无内容)的内容
  • 如何向数据库报告错误

任何帮助/提示都会受到赞赏,我会在此期间继续查看论坛和内容。

4 个答案:

答案 0 :(得分:1)

Express使用一系列中间件来处理请求。如果路由匹配并定义了路由,它将处理它。否则,你可以把&#39; / 404&#39;导入所有路由后最后路由。当没有找到路线时,它会自动到达那里。否则,如果您不想发送回复,可以使用next(),以便它转移到下一个中​​间件,最终转移到&#39; / 404&#39;中间件。

/* GET users listing. */
router.get('/', function(req, res, next) {
    connection.query('SELECT id, name FROM user', function(err, rows, fields) {
    if (err) {
       return res.status(502).json({message:'db error'});
    };
    res.render('users', {
         title: 'Users',
         userList: rows
     });
 });
});

答案 1 :(得分:1)

谢谢大家的回答。我正在寻找(和找到)的是 next(错误)函数,用于将控制传递给位于app.js中的错误处理程序(参见http://expressjs.com/en/guide/routing.html以获取更多详细信息)。

答案 2 :(得分:0)

在Express中,每个路由处理程序都会传递一个'res'参数,该参数用于向客户端提供响应。创建具有特定代码,代码错误和空体的响应的示例用法

router.get('/', function(req, res, next) {
     res.status(401, "Authentication mismatch").json({});
});

您也可以使用send()来发送纯文本,而不是json()。

答案 3 :(得分:0)

您可以使用statusCode提供相关消息,例如

/* GET users listing. */
router.get('/', function(req, res, next) {
  connection.query('SELECT id, name FROM user', function(err, rows, fields) {
    if (err){
      res.status(500).send("Something is not right");

    };
    //if you get rows of array type, then you can do this for empty records
    else if(rows.length===0){
      res.status(204).send('No records found!')
    }else{
    res.render('users', {
      title: 'Users',
      userList: rows
    });
  }
  });
});