我正在嘗試設定一個簡單的 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)沒有任何問題,所以我在這里更加困惑。我嘗試查找此錯誤,但大多數似乎不適用于這種情況。
uj5u.com熱心網友回復:
請注意,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);
});
});
如果您想從請求中提取其他資訊,您可以查看有關如何操作的檔案,但不要假設request或response型別只是它們的內容。
編輯:我沒有意識到您正在使用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)
})
uj5u.com熱心網友回復:
關于請求,您需要了解什么?方法、url、標題、查詢、引數...只需提取您需要的內容:
app.get("/", function(request,response){
const { headers, method, url, search } = request;
response.json({
headers, method, url, search
});
});
您不應該將整個請求發回,因為它是一個從未打算序列化的復雜物件。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/495274.html
標籤:javascript 节点.js 表示 http
上一篇:在BlazorWebAssembly專案中,PutAsync()方法呼叫失敗,但除錯效果不夠好,無法查看發生了什么
