【发布时间】:2020-07-17 10:35:47
【问题描述】:
我有一个 react 应用程序正在向 express 节点服务器进行 REST。
快速路由器定义了一堆rest端点。
当我使用邮递员点击快速路由器中的端点时,它工作正常。
当我用我的 react 应用程序到达端点时,它没有。当我的 react 应用程序使用 axios 进行调用时,我看到 400 错误。
这就是我的 index.js 的样子:
const express = require("express");
const mongoose = require("mongoose");
const bodyParser = require("body-parser");
const passport = require("passport");
const cors = require("cors");
const app = express();
app.use(bodyParser.urlencoded({ extended: false }));
// server.use(bodyParser.json());
app.use(cors());
// app.options("*", cors());
const UserModel = require("./models/User");
mongoose
.connect(
"mongodb"
)
.then(() => console.log("SUCESSFULLY connected to MongoDB!"))
.catch((error) => console.log(`FAILED tot connect to MongoDB: ${error}`));
require("./auth/localStrategyAuth");
const authRoutes = require("./routes/authRoutes");
app.use("/v1", authRoutes);
// app.post("/", (req, res) => {
// res.send("Hello World!");
// });
// app.post("/v1/signup", (req, res) => {
// console.log("lol");
// });
// app.use(express.json());
const PORT = 5000;
app.listen(PORT, () =>
console.log(`ui-rest listening on port localhost:${PORT}`)
);
user.js
const mongoose = require("mongoose");
const bcrypt = require("bcrypt");
const { Schema } = mongoose;
const UserSchema = new Schema({
email: {
type: String,
required: true,
unique: true,
},
password: {
type: String,
required: true,
},
});
const UserModel = mongoose.model("user", UserSchema);
module.exports = UserModel;
authRoutes.js
const express = require("express");
const passport = require("passport");
const jwt = require("jsonwebtoken");
const JWTstrategy = require("passport-jwt").Strategy;
//We use this to extract the JWT sent by the user
const ExtractJWT = require("passport-jwt").ExtractJwt;
const router = express.Router();
// When the user sends a post request to this route, passport authenticates the user based on the
// middleware created previously
router.post(
"/signup",
passport.authenticate("signup", { session: false }),
async (req, res, next) => {
res.json({
message: "Signup successful",
user: req.user,
});
}
module.exports = router;
localStrategyAuth.js
const passport = require("passport");
const localStrategy = require("passport-local").Strategy;
const UserModel = require("../models/User");
//Create a passport middleware to handle user registration
passport.use(
"signup",
new localStrategy(
{
usernameField: "email",
passwordField: "password",
},
async (email, password, done) => {
try {
// Save the information provided by the user to the the database
const user = await UserModel.create({ email, password });
// Send the user information to the next middleware
return done(null, user);
} catch (error) {
done(error);
}
}
)
);
这是我的快速路由器的样子:
const express = require("express");
const router = express.Router();
router.post(
"/signup",
passport.authenticate("signup", { session: false }),
async (req, res, next) => {
res.json({
message: "Signup successful",
user: req.user,
});
}
);
module.exports = router;
我错过了什么?我已经在 index.js 文件中设置了 CORS。我只是看不出我哪里错了。为什么我的 React 应用程序无法访问快速路由器端点。
如果我有一个普通的 express 端点,那么我的 react 应用程序就可以访问这些端点。例如,当我的 react 应用点击它时,下面的端点可以正常工作。
const express = require("express");
const bodyParser = require("body-parser");
const cors = require("cors");
const app = express();
app.post("/", (req, res) => {
res.send("Hello World!");
});
const PORT = 5000;
app.listen(PORT, () =>
console.log(`listening on port localhost:${PORT}`)
app.post("/someSignup", (req, res) => {
console.log("signup");
});
我也尝试过没有运气之类的事情:
const authRoutes = require("./routes/authRoutes");
authRoutes.use(cors());
这是我的 react 代码在提交 rest 调用时的样子:
// axios setup
axios.create({
baseURL: "http://localhost:5000",
// headers: {
// "Content-Type": "application/json",
// },
});
// Handle submit
handleSubmit = async (event) => {
event.preventDefault();
const newUserData = {
// firstName: this.state.firstName,
// lastName: this.state.lastName,
email: this.state.email,
password: this.state.password,
};
const result = await axios.post("/v1/signup", newUserData);
console.log(result);
};
【问题讨论】:
-
400 表示请求错误。屏幕截图中的响应选项卡上显示什么?
-
当我的 react 应用程序对其进行休息调用时,我从 express 节点服务器获得的响应。
-
它显示什么?你能补充一下这个问题吗?你也可以在调用这个 api 的地方添加反应代码吗?
-
@SuleymanSah 用反应代码更新了描述,其余的调用。
what does it display是什么意思 -
显示响应选项卡,在标题选项卡的右侧。
标签: javascript node.js reactjs express