You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

函数抛出错误时跳转错误页面的实现问题

问题

希望在函数抛出错误时加载新的错误页面,但目前页面卡在加载状态。已通过try-catch捕获到getStockPoints函数的错误,但页面仍无法跳转到错误页面。

相关代码

stocks.js

module.exports = {
  async getStocks () {
    return stocks
  },
  async getStockPoints (stockName, timestamp) {
    if (Math.random() < FAILUE_RATE) {
      throw new Error('Failed to generate stock data')
    }
    if (!stocks.includes(stockName)) {
      throw new Error(`Uknown stock ${stockName}`)
    }
    const timestamps = getTimestamps(+timestamp, 10)
    return getSeries(stockName, timestamps).map((value, idx) => ({
      value,
      timestamp: timestamps[idx]
    }))
  }
}

app.js

app.get('/stocks/:symbol', async (req, res) => {
  const { params: { symbol } } = req
  try{
    const data = await stocks.getStockPoints(symbol, new Date())
    res.render('stockPoints', {DATA: data})
  }
  catch(e){
    console.log("ERRORs: ")
    console.error(e)
  }
})

捕获到的错误信息

Error: Uknown stock df
    at Object.getStockPoints (C:\Users\talha_znbd0fl\Desktop\JavaScript-Challenge-master-main\JavaScript-Challenge-master-main\stocks.js:47:13)
    at C:\Users\talha_znbd0fl\Desktop\JavaScript-Challenge-master-main\JavaScript-Challenge-master-main\app.js:24:31
    at Layer.handle [as handle_request] (C:\Users\talha_znbd0fl\Desktop\JavaScript-Challenge-master-main\JavaScript-Challenge-master-main\node_modules\express\lib\router\layer.js:95:5)
    at next (C:\Users\talha_znbd0fl\Desktop\JavaScript-Challenge-master-main\JavaScript-Challenge-master-main\node_modules\express\lib\router\route.js:144:13)
    at Route.dispatch (C:\Users\talha_znbd0fl\Desktop\JavaScript-Challenge-master-main\JavaScript-Challenge-master-main\node_modules\express\lib\router\route.js:114:3)
    at Layer.handle [as handle_request] (C:\Users\talha_znbd0fl\Desktop\JavaScript-Challenge-master-main\JavaScript-Challenge-master-main\node_modules\express\lib\router\layer.js:95:5)
    at C:\Users\talha_znbd0fl\Desktop\JavaScript-Challenge-master-main\JavaScript-Challenge-master-main\node_modules\express\lib\router\index.js:284:15
    at param (C:\Users\talha_znbd0fl\Desktop\JavaScript-Challenge-master-main\JavaScript-Challenge-master-main\node_modules\express\lib\router\index.js:365:14)
    at param (C:\Users\talha_znbd0fl\Desktop\JavaScript-Challenge-master-main\JavaScript-Challenge-master-main\node_modules\express\lib\router\index.js:376:14)
    at Function.process_params (C:\Users\talha_znbd0fl\Desktop\JavaScript-Challenge-master-main\JavaScript-Challenge-master-main\node_modules\express\lib\router\index.js:421:3)

解决方案

页面卡在加载状态的核心原因是catch块未向客户端返回任何响应,浏览器持续等待服务器回复,因此无法跳转。只需在catch块中添加错误页面的渲染逻辑即可解决:

修改app.js中的路由处理代码:

app.get('/stocks/:symbol', async (req, res) => {
  const { params: { symbol } } = req
  try{
    const data = await stocks.getStockPoints(symbol, new Date())
    res.render('stockPoints', {DATA: data})
  }
  catch(e){
    console.log("ERRORs: ")
    console.error(e)
    // 渲染错误页面,可传递错误信息给模板
    res.status(404).render('errorPage', { errorMessage: e.message })
  }
})

补充说明

  • res.status(404):根据错误类型设置对应HTTP状态码,比如未知股票用404,服务端生成数据失败用500
  • res.render('errorPage', ...):需确保已创建对应的errorPage模板文件,模板可通过errorMessage变量展示具体错误内容
  • 若无需传递错误信息,也可直接重定向到独立错误页面:res.redirect('/error'),同时需添加/error路由来渲染错误页面

内容的提问来源于stack exchange,提问作者Talha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 12:40:23