我不知所措,想不出如何用谷歌搜索這個。
我正在構建一個 MERN 全堆疊應用程式作為我的第一個個人專案。有人告訴我它太大了(他們是對的)我會筋疲力盡(我是)。好吧,笑話他們。他們是對的。
作為測驗,我讓服務器回應來自類似 4 個用戶的資料庫中的類似 4 個用戶資訊的串列。這是在前端設定為 useEffect ,不確定是否有幫助,人們告訴我它不應該對它產生影響。
它只作業一半的時間,如果不少于那。其他時候服務器崩潰就像我的狗狗幣投資一樣,說我已經使用了 res.send,這讓我想把我的電腦和監視器扔出我的窗外并嚇唬我樓下的鄰居,這不會那么糟糕,因為她愛管閑事總是評論我的郵件,并認為她是我的郵遞員。
這是服務器控制臺上的錯誤
events.js:292
throw er; // Unhandled 'error' event
^
Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
at ServerResponse.setHeader (_http_outgoing.js:558:11)
at ServerResponse.header (/Users/apple/Documents/Web Dev/collab/Backend/node_modules/express/lib/response.js:771:10)
at ServerResponse.send (/Users/apple/Documents/Web Dev/collab/Backend/node_modules/express/lib/response.js:170:12)
at ServerResponse.json (/Users/apple/Documents/Web Dev/collab/Backend/node_modules/express/lib/response.js:267:15)
at ServerResponse.send (/Users/apple/Documents/Web Dev/collab/Backend/node_modules/express/lib/response.js:158:21)
at /Users/apple/Documents/Web Dev/collab/Backend/routes/index.js:81:9
at /Users/apple/Documents/Web Dev/collab/Backend/node_modules/mongoose/lib/model.js:5065:18
at processTicksAndRejections (internal/process/task_queues.js:75:11)
Emitted 'error' event on Function instance at:
at /Users/apple/Documents/Web Dev/collab/Backend/node_modules/mongoose/lib/model.js:5067:15
at processTicksAndRejections (internal/process/task_queues.js:75:11) {
code: 'ERR_HTTP_HEADERS_SENT'
與我的懶惰 Ex GF 一樣經常使用的路由是 router.get(/users)
路由/index.js 檔案
const router = require("express").Router();
const passport = require("passport");
const bodyParser = require("body-parser");
const genPassword = require("../lib/passwordUtils").genPassword;
const connection = require("../config/database");
const mongoose = require("mongoose");
const User = mongoose.models.User;
const isAuth = require("./authMiddleware").isAuth;
// cors is needed with router.use else you have to put routes on the app.js
const cors = require("cors");
router.use(cors({ origin: "http://localhost:3001", credentials: true }));
// const isAdmin = require("./authMiddleware").isAdmin;
router.use(bodyParser.urlencoded({ extended: false }));
/**
* -------------- Post ROUTES ----------------
*
*/
// router.post(
// "/login",
// passport.authenticate("local"),
// (req, res) => {
// console.log("working");
// res.sendStatus(200);
// }
// );
// router.post("/login", (req, res) => {
// passport.authenticate("local", (err, user, info) => {
// res.status(200);
// });
// });
router.post("/login", (req, res, next) => {
passport.authenticate("local", (err, user, info) => {
if (err) throw err;
if (!user) res.send("No User Exists");
else {
req.logIn(user, (err) => {
if (err) throw err;
res.send(user);
return;
console.log(req.user);
});
}
})(req, res, next);
});
router.post("/register", (req, res) => {
const saltHash = genPassword(req.body.repeatPassword);
const salt = saltHash.salt;
const hash = saltHash.hash;
const newUser = new User({
username: req.body.firstInput,
fName: "",
lName: "",
title: "",
hash: hash,
salt: salt,
});
newUser.save().then((user) => {});
res.sendStatus(200);
});
/**
* -------------- GET ROUTES ----------------
*
*/
router.get("/user", (req, res) => {
res.send(req.user);
});
router.get("/users", (req, res) => {
User.find({}, function (err, users) {
const userMap = {};
users.forEach(function (user) {
userMap[user._id] = user;
});
res.send(userMap);
});
});
router.post("/user", (req, res) => {
const fName = req.body.firstInput;
const lName = req.body.secondInput;
const title = req.body.repeatPassword;
const user = req.session.passport.user;
User.updateOne(
{ _id: user },
{ fName: fName, lName: lName, title: title },
function (err, result) {
if (err) {
res.sendStatus(401);
console.log(err);
} else {
res.sendStatus(200);
}
}
);
// console.log(res.user);
});
router.get("/", isAuth);
// router.get("/logout", (req, res) => {
// res.status(200);
// req.logOut();
// });
// app.use((req, res) => {
// User.findOne({ url: req.body.url })
// .then((user) => {
// if (!user) {
// console.log("No user Found");
// res.send("No user found");
// } else {
// console.log("user Found");
// res.send(user).status(200);
// }
// })
// .catch((err) => {
// console.log(err);
// });
// });
// function getUser(req, res, next) {
// User.findOne({ url: req.body.url })
// .then((user) => {
// if (!user) {
// console.log("No user Found");
// res.status(401);
// next();
// } else {
// console.log("success");
// res.send({ user }).status(200);
// }
// })
// .then((response) => console.log(response))
// .catch((err) => {
// console.log(err);
// });
// }
// router.post("/visitor", getUser);
module.exports = router;
這是路由/authMiddleware 檔案
if (req.isAuthenticated()) {
return res.status(200).json({ user: req.user, auth: true });
} else {
console.log("Nope");
res.status(401).json({ auth: false });
}
};
// module.exports.isAdmin = (req, res, next) => {
// if (req.isAuthenticated() && req.user.admin) {
// next();
// } else {
// res.status(401).json({ msg: 'You are not authorized to view this resource because you are not an admin.' });
// }
// }
如果需要,這里是前端 React。它比我哥哥開的卡車還丑,但我是新來的,所以我媽媽想讓你幫我放松一下。
import React, { useContext, useEffect } from "react";
// import { useHistory } from "react-router-dom";
import "./loggedStyles.css";
import Dialog from "@mui/material/Dialog";
import DialogContent from "@mui/material/DialogContent";
import SecondBoard from "../../QuestionBoard/secondBoard";
import { LoginContext, DialogueContext } from "../../../Context/context";
function Logged(props) {
const { userInfo, setUserInfo } = useContext(LoginContext);
const { openDialogue, setDialogue } = useContext(DialogueContext);
const [fullWidth, setFullWidth] = React.useState(true);
const [maxWidth, setMaxWidth] = React.useState("sm");
useEffect(() => {
if (userInfo.fName !== "") {
setDialogue(false);
} else {
setDialogue(true);
}
}, [userInfo, setDialogue]);
const closeDialogue = () => {
setDialogue(true);
};
useEffect(() => {
fetch("http://localhost:3000/user", {
method: "GET",
credentials: "include",
withCredentials: true,
headers: {
"Content-Type": "application/json",
},
})
.then(function (response) {
if (!response.ok) {
console.log(response.status);
throw new Error("HTTP status " response.status);
} else {
return response.json();
}
})
.then((data) => {
if (userInfo.fName === "") {
setUserInfo({
...userInfo,
id: data._id,
fName: data.fName,
lName: data.lName,
title: data.title,
});
} else {
return;
}
})
.catch((err) => console.log(err));
}, [userInfo, setUserInfo]);
useEffect(() => {
fetch("http://localhost:3000/users", {
method: "GET",
credentials: "include",
withCredentials: true,
headers: {
"Content-Type": "application/json",
},
})
.then(function (response) {
if (!response.ok) {
console.log(response.status);
throw new Error("HTTP status " response.status);
} else {
return response.json();
}
})
.then((data) => {
console.log(data);
})
.catch((err) => console.log(err));
}, []);
return [
<div className="wrapper">
<Dialog
fullWidth={fullWidth}
maxWidth={maxWidth}
open={openDialogue}
sx={{ border: "solid black" }}
>
<DialogContent sx={{ p: 0, borderRadius: "2vw" }}>
<SecondBoard
header="Basic Information"
headerText="Fill in all Information"
firstPlaceHolder="Enter your first name here"
secondPlaceholder="Enter your last name here"
thirdPlaceholder="Your Title (Job/Career)"
passwordMatchClass="noDisplay"
fetchRoute="user"
/>
</DialogContent>
</Dialog>
<div className="section">
<div className="top_navbar">
<h4>DashBoard</h4>
</div>
<div className="container">
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do
eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad
minim veniam, quis nostrud exercitation ullamco laboris nisi ut
aliquip ex ea commodo consequat. Duis aute irure dolor in
reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum
dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor
incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea
commodo consequat. Duis aute irure dolor in reprehenderit in voluptate
velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint
occaecat cupidatat non proident, sunt in culpa qui officia deserunt
mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur
adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore
magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation
ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute
irure dolor in reprehenderit in voluptate velit esse cillum dolore eu
fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident,
sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem
ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim
veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex
ea commodo consequat. Duis aute irure dolor in reprehenderit in
voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur
sint occaecat cupidatat non proident, sunt in culpa qui officia
deserunt mollit anim id est laborum.
</div>
</div>
<div className="sidebar">
<div className="profile">
<img
src="https://1.bp.blogspot.com/-vhmWFWO2r8U/YLjr2A57toI/AAAAAAAACO4/0GBonlEZPmAiQW4uvkCTm5LvlJVd_-l_wCNcBGAsYHQ/s16000/team-1-2.jpg"
alt="profile_picture"
/>
<h3>
{userInfo.fName} {userInfo.lName}
</h3>
<p>{userInfo.title}</p>
</div>
<ul>
<li>
<a href="/" className="active">
<span className="icon">
<i className="fas fa-home"></i>
</span>
<span className="item">Home</span>
</a>
</li>
<li>
<a href="/">
<span className="icon">
<i className="fas fa-desktop"></i>
</span>
<span className="item">My Dashboard</span>
</a>
</li>
<li>
<a href="/">
<span className="icon">
<i className="fas fa-user-friends"></i>
</span>
<span className="item">People</span>
</a>
</li>
<li>
<a href="/">
<span className="icon">
<i className="fas fa-tachometer-alt"></i>
</span>
<span className="item">Perfomance</span>
</a>
</li>
<li>
<a href="/">
<span className="icon">
<i className="fas fa-database"></i>
</span>
<span className="item">Development</span>
</a>
</li>
<li>
<a href="/">
<span className="icon">
<i className="fas fa-chart-line"></i>
</span>
<span className="item">Reports</span>
</a>
</li>
<li>
<a href="/">
<span className="icon">
<i className="fas fa-user-shield"></i>
</span>
<span className="item">Admin</span>
</a>
</li>
<li>
<a href="/">
<span className="icon">
<i className="fas fa-cog"></i>
</span>
<span className="item">Settings</span>
</a>
</li>
</ul>
</div>
</div>,
];
}
export default Logged;
編輯 編輯剛剛意識到我過早地提出了我的問題,然后才意識到我應該通知您我在 useEffect 中為 /users 進行了 Fetch,直到最近才真正作為最后的努力來搞砸并試圖找出答案。
uj5u.com熱心網友回復:
要在評論中擴展討論...
const isUser = (req, res, next) => {
if (req.isAuthenticated()) {
return res.status(200).json({ user: req.user, auth: true });
} else {
console.log("Nope");
res.status(401).json({ auth: false });
}
};
該身份驗證中間件無條件地發送回應,因此使用該中間件的路徑中的任何實際處理程式都無法發送另一個回應。
在正常情況下,auth 中間件可能不會發送回應,而應該呼叫next(),因此路由被呼叫。這在Express 的檔案中有很好的解釋。
uj5u.com熱心網友回復:
可能不是原因,但這似乎是錯誤的,您可能打算在 res.send 部分周圍使用大括號。
if (!user) res.send("No User Exists");
else {
req.logIn(user, (err) => {
if (err) throw err;
res.send(user);
return;
console.log(req.user);
});
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/356415.html
標籤:javascript 节点.js 反应 表达
上一篇:npm錯誤!缺少腳本:“開發”
下一篇:如何在React中清理HTML?
