![](/img/trans.png)
[英]How can I style the data sent using response.send () in express.js
[英]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);
});
});
如果您想從請求中提取其他信息,您可以查看文檔以了解如何執行此操作,但不要假設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)
})
關於請求,您需要了解什么? 方法、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.