無法在Express、Node和Javascript中連接前端和后端

感謝您抽出時(shí)間閱讀我的問題。目前,我正在使用一個(gè)下拉列表,使用“選擇”標(biāo)簽供用戶選擇。并且完全堅(jiān)持以下幾點(diǎn)。localhost,所有其他頁面和函數(shù)正常工作。但無法在Express、Node和Javascript中連接前端和后端

任何幫助都將不勝感激。

我使用的把手模板如下。

<div class="container center">
  <div class="row">
  <h3 class="flow-text">Search for items you can exchange your item with</h3>
  <div class="col s12">
    <label>Search by Category</label>
  <select id="category" class="browser-default" onchange="getItems()">
    <option value="" disabled selected>I am looking for...</option>
    <option value="2">Vegetables</option>
    <option value="3">Clothes</option>
    <option value="4">Fruits</option>
    <option value="1">Other</option>
  </select>
  </div>
</div>

<div class="row">

{{#each editedItems as |i|}}
<div class="col s12 m4">
      <!---->
      <div class="card">
        <div class="card-image">
          <img src="/images/strawberry.jpg">
          <span class="card-title">{{i.title}}</span>
          <a class="btn-floating halfway-fab waves-effect waves-light red" href="/item/{{i.id}}"><i class="material-icons">zoom_in</i></a>
        </div>
        <div class="card-content">
          <p class="truncate">{{i.description}}</p>
        </div>
      </div>
      <!---->
    </div>
{{/each}}

</div>

</div>

<script src="/js/searchItems.js"></script>

在更改選擇時(shí),javascript將在/js/searchItems.js中運(yùn)行名為get items的函數(shù)。我使用一個(gè)簡單的警報(bào)檢查腳本是否鏈接。在我輸入實(shí)際的功能代碼之前,每更改一次,這些警報(bào)就會起作用。

searchItems.js具有以下代碼。

function getItems() {
    const select = document.getElementById('category');
    let option = select.options[select.selectedIndex];
    let categoryId = option.value;

    searchByCategory(categoryId);
   
}

const searchByCategory = async (categoryId) => {
    const response = await fetch(`/items/${categoryId}`, {
      method: 'GET',
      headers: { 'Content-Type': 'application/json' },
    });
  
    if (response.ok) {
      console.log("Response ok");
    } else {
      console.log("Error");
    }
  };

在后端,通過使用從下拉列表中的選項(xiàng)值中獲取的類別id來編寫以下路由以獲取項(xiàng)目。

router.get('/items/:category', async (req, res) => {
  try {
      const categoryId = req.params.category;
      const existingItems = await Item.findAll({
      where:{
          category_id : categoryId
      },
      order: [['id','DESC']],
    });
    
      const editedItems = existingItems.map((item) => item.get({ plain: true }));
    
      res.render('search', { 
          editedItems, 
          logged_in: req.session.logged_in 
    });
  } catch (err) {
    res.status(500).json(err);
  }
});

同一路由文件中的所有其他路由正在按預(yù)期工作。我嘗試使用Insomina Core模擬這條路線,它按照我的預(yù)期呈現(xiàn)了頁面。

但是在localhost中,所有其他頁面和函數(shù)都正常工作。但是,當(dāng)我更改下拉列表中的選項(xiàng)時(shí)(根據(jù)下面的屏幕截圖),與類別相關(guān)的項(xiàng)目將不會出現(xiàn)。

但它給出了“respose ok”——查看控制臺,如下所示。

我使用Handlebar作為模板引擎、Express服務(wù)器、MySQL和Nodejs。

任何支持都將不勝感激。非常感謝你。

? 最佳回答:

您混合了兩種類型的HTTP請求。XMLHttpRequest(AJAX)和常規(guī)HTTP請求。

您正在使用ajax進(jìn)行調(diào)用,但是您正在從服務(wù)器進(jìn)行響應(yīng),就像它是一個(gè)普通的頁面視圖一樣。通常,在Express中,您會使用response.send([body]或使用response.json([body])等方便的方法響應(yīng)ajax請求。它們通常以某種方式格式化響應(yīng)體和/或添加一些標(biāo)題,但它們基本上是相同的。我強(qiáng)烈建議您瀏覽鏈接頁面以幫助理解。

您的瀏覽器通過將“正常”http請求呈現(xiàn)為頁面來處理這些請求。但是您的ajax庫(在本例中為fetch)得到了響應(yīng),卻什么也不做。通常,您需要編寫一些JavaScript來處理響應(yīng),即解析主體并以某種方式操縱頁面。

但是,由于您返回的是HTML而不是JSON,因此可以將此HTML注入頁面的一部分。請參閱innerHTML。但這可以說是一種過時(shí)的方法,我建議讓您的初始模板完全通過JavaScript進(jìn)行操作。

主站蜘蛛池模板: 成人区人妻精品一区二区三区 | V一区无码内射国产| 麻豆国产在线不卡一区二区 | 国产成人久久一区二区三区| 国产成人一区二区动漫精品| 中文国产成人精品久久一区| 午夜爽爽性刺激一区二区视频| 亚洲人成网站18禁止一区 | 国产精品特级毛片一区二区三区| 亚洲一区二区三区在线| 成人区人妻精品一区二区不卡视频| 三级韩国一区久久二区综合| 亚洲午夜一区二区电影院| 亚洲熟妇av一区二区三区| 国产成人精品a视频一区| 精品91一区二区三区| 精品国产一区二区三区在线| 亚洲国产成人久久综合一区 | 亚洲一区中文字幕在线观看| 亚洲一区二区三区在线观看精品中文 | av无码免费一区二区三区| 香蕉久久一区二区不卡无毒影院| 中文字幕无线码一区2020青青| 亚洲第一区精品日韩在线播放| 视频在线一区二区三区| 精品国产一区二区三区香蕉事| 性色AV一区二区三区天美传媒| 一区二区三区视频| 一本一道波多野结衣AV一区| 精品无码一区二区三区电影| 精品一区二区三区在线观看视频| 无码国产伦一区二区三区视频| 日本丰满少妇一区二区三区 | 中文字幕日韩一区二区不卡| 亚洲av午夜福利精品一区人妖| 亚洲一区精品中文字幕| 久久se精品一区二区国产| 91精品一区二区| 久久国产精品视频一区| 国产精品男男视频一区二区三区| 久久精品一区二区三区中文字幕|