節點 16.14.2,Express 4.18.1
我見過很多人修改 res.send 以在回應發送到客戶端之前執行操作。
app.use(function (req, res, next) {
originalSend = res.send;
res.send = function (body) {
// Do something with the body...
originalSend.call(this, body);
};
next();
});
但是,如果我發送“body”以外的資料,則會導致一些錯誤。
originalSend = res.send;
res.send = function (body) {
originalSend.call(this, body);
// Works fine
originalSend.call(this, { ...body, "USER": req.user });
// RangeError: Too many properties to enumerate
originalSend.call(this, {})
// RangeError: Maximum call stack size exceeded
originalSend.call(this, { "Foo": "bar" })
// RangeError: Maximum call stack size exceeded
}
我已經嘗試了幾乎所有東西,“身體”是唯一會經歷的東西,怎么會?
更新:
似乎將資料轉換為字串解決了這個問題。
我仍然不知道為什么首先會出現問題,因為 send 應該能夠處理物件和其他型別的資料(在我的應用程式的這個函式定義之外可以正常作業)。
originalSend.call(this, JSON.stringify({ ...body, "Foo": "bar" }));
uj5u.com熱心網友回復:
這是作業代碼:
const originalSend = res.send;
res.send = function (body) {
// Do something with the body...
originalSend.call(this, JSON.stringify({ ...JSON.parse(body), 'USER': 'user' }));
//console.log(typeof body)
};
原因:
body函式中的引數有string型別。這意味著最初的res.send呼叫只接受字串值。因此,要將您的自定義值與動態回應相結合,您必須轉換body為 JSON,然后將整個第二個引數轉換call為字串化物件。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/527408.html
上一篇:`setState`不更新陣列
