簡體   English   中英

為什么我不能使用 express.js 將 HTTP 請求的內容作為響應發送?

[英]Why can I not send the contents of HTTP request as a response with express.js?

我正在嘗試設置一個簡單的 Web 服務器,它使用 node.js 和 express.js 將請求的內容作為響應返回。 我的代碼如下:

const express = require('express');
const app = express();
const port = 3000;

app.get("/", function(request,response){
  // console.log(request);
  response.send(request);
});

app.listen(port, function() {
  console.log("Server started on port #" + port);
});

我得到這個錯誤:

TypeError: Converting circular structure to JSON
    --> starting at object with constructor 'Socket'
    |     property 'parser' -> object with constructor 'HTTPParser'
    --- property 'socket' closes the circle
    at JSON.stringify (<anonymous>)

到底發生了什么?如何修改我的代碼以實現我的初始目標? 我想返回一個包含請求內容的響應。 我可以console.log(request)沒有任何問題,所以我在這里更加困惑。 我嘗試查找此錯誤,但大多數似乎不適用於這種情況。

請注意, Request類型不僅僅是請求的內容,您可以在Node.js 官方文檔中閱讀有關它的內容。 最值得注意的是,該類型表示一個正在進行的請求,其標頭已被排隊 不是完整的請求:當您調用函數時,可能仍會發送正文! 這是 HTTP 庫中的常見模式,因為您可以在正文准備好發送之前處理 HTTP 標頭。

這是一個復雜的對象,里面有循環引用 這意味着對象的某些屬性指向同一個對象的另一個屬性,而您無法在 JSON 中表示這是一個很好的問題 您仍然可以執行console.log ,因為該函數可以優雅地處理循環引用。

為了回顯請求,您需要明確等待主體完全發送(可能會分成塊)。 同樣, 官方文檔涵蓋了這一點:

app.get("/", function(request,response){
  let body = [];
  request.on('data', (chunk) => {
    body.push(chunk);
  }).on('end', () => {
    body = Buffer.concat(body).toString();
    // at this point, `body` has the entire request body stored in it as a string
    response.send(body);
  });
});

如果您想從請求中提取其他信息,您可以查看文檔以了解如何執行此操作,但不要假設requestresponse類型只是它們的內容。

編輯:我沒有意識到您正在使用express.js ,它具有不同的request類型。 原理是一樣的,但是body的暴露方式不同,你可以在官方文檔中找到:

var express = require('express')

var app = express()

app.use(express.json()) // for parsing application/json
app.use(express.urlencoded({ extended: true })) // for parsing application/x-www-form-urlencoded

get('/', function (req, res) {
  res.json(req.body)
})

關於請求,您需要了解什么? 方法、url、標題、查詢、參數...只需提取您需要的內容:

app.get("/", function(request,response){
  const { headers, method, url, search } = request;
  response.json({
    headers, method, url, search
  });
});

您不應該將整個請求發回,因為它是一個從未打算序列化的復雜對象。

暫無
暫無

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

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