簡體   English   中英

Node.js res.json() 和 res.send(),不工作但仍能更改狀態碼

[英]Node.js res.json() and res.send(), not working but still able to change status code

我已經閱讀了幾乎所有關於此的主題,但仍然無法弄清楚出了什么問題。

客戶端不會收到任何信息,無論是 res.send()、res.json()、res.write() res.end()。 但是我知道信息正在發送和存儲,因為數據庫正在更新,並且我知道有響應,因為我可以控制台記錄 object 並且如果我更改服務器的狀態代碼(例如 200 與 201)打印的響應在客戶端反映了這一點。

客戶端通過郵寄方式將 email 發送到服務器。

var object = JSON.stringify({
      email: myemail,
    });
    await fetch('http://localhost:4000/api/subscriber/', {
      method: 'POST',
      body: object,
      headers: {
        'Content-Type': 'application/json'
      }
    }).then(res => {
      res.json();
    console.log(res);})
    .then(response => console.log('Success:', response))
    .catch(error => console.error('Error:', error));

當我運行它時,這些是日志:

響應 {type: "cors", url: "http://localhost:4000/api/subscriber/", 重定向: false, status: 201, ok: true, ...}

成功:未定義

這是相關的服務器端代碼

路徑調用一個 function

app.post('/api/subscriber/', (request, response) => {
   db.createSubscriber(request, response);
   })

然后將信息存儲在數據庫中並發送響應。 這就是問題所在——我嘗試在這里發送的任何內容——甚至隨機文本都不會顯示,但我知道通信正在發生,因為當我更改它時,我可以看到從客戶端記錄的狀態代碼。

const createSubscriber = (request, response) => {
   const { firstname, lastname, email } = request.body;
   const text = //SQL query
   const values = [firstname, lastname, email]
   pool.query(text, values, (error, results) => {
      if (error) {
          console.log('error');
          response.status(400);
          throw error;
      } else {
          response.status(201).json({status:201,id:results.insertID});
      }
      return response;
   })
}

我嘗試了不同的發送、分配變量和使用方法。然后,進行了大量的小調整。 我不知道我在這里做錯了什么。

謝謝您的幫助!

使用瀏覽器中的fetch()res.json()返回一個新的 promise ,您必須等待帶有await或 .then .then() ) 的 promise 才能從中獲取數據。

所以,你會這樣做:

await fetch('http://localhost:4000/api/subscriber/', {
  method: 'POST',
  body: object,
  headers: {
    'Content-Type': 'application/json'
  }
}).then(res => res.json()).then(data => {
    console.log(data);
}).catch(error => console.error('Error:', error));

此外,在服務器端,您的錯誤處理需要一些修復。 改變這個:

  if (error) {
      console.log('error');
      response.status(400);
      throw error;
  } 

對此:

  if (error) {
      console.log(error);
      response.sendStatus(400);
  } 

您必須始終發送響應。 您正在設置錯誤狀態,但從未發送響應。 而且, throw err根本沒有用。 沒有什么能抓住它,所以它沒有任何好處。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM