#javascript #node.js #express #hash #bcrypt
#javascript #node.js #выразить #хэш #bcrypt
Вопрос:
Я пытаюсь создать простое приложение для входа в систему с помощью стека MERN, и у меня возникла проблема при использовании bcrypt для хеширования моего пароля.
server.js
const mongoose = require("mongoose");
const express = require("express");
const cors = require("cors");
const passport = require("passport");
const passportLocal = require("passport-local").Strategy;
const cookieParser = require("cookie-parser");
const bcrypt = require("bcrypt");
const session = require("express-session");
const bodyParser = require("body-parser");
const app = express();
const User = require("./user")
mongoose.connect(
mongodbLink,
{
useNewUrlParser: true,
useUnifiedTopology: true,
},
() => {
console.log("Mongoose Is Connected");
}
);
// Middleware
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(
cors({
origin: "http://localhost:3000", // <-- location of the react app were connecting to
credentials: true,
})
);
app.use(
session({
secret: "secretcode",
resave: true,
saveUninitialized: true,
})
);
app.use(cookieParser("secretcode"));
app.use(passport.initialize());
app.use(passport.session());
//routes
app.post('/login',(req,res,next) => {
passport.authenticate("local",(err,user,info) =>{
if (err) throw err
if(!user) res.send("No user with given login")
else {
req.logIn(user, (err) => {
if (err) throw err
res.send("Succesfully Authenticated")
console.log(req.user)
})
}
})(req,res,next)
})
app.post("/register", (req, res) => {
User.findOne({ username: req.body.username }, async (err, doc) => {
if (err) throw err;
if (doc) res.send("User Already Exists");
if (!doc) {
const hashedPassword = bcrypt.hashSync(req.body.password, 10);
const newUser = new User({
username: req.body.username,
password: hashedPassword,
});
await newUser.save();
res.send("User Created");
}
});
});
app.get('/user',(req,res) => {
res.send(req.user)
})
//listen
app.listen(4000, () => {
console.log("Server Has Started");
});
User.js
const user = new mongoose.Schema({
username: String,
password: String,
})
module.exports = mongoose.model("User",user)
Мой post-запрос post от post-post на http://localhost:4000/register
{
"username":"user123",
"password":"pass",
}
У меня есть это сообщение об ошибке в консоли, когда я тестирую свой маршрут регистрации с помощью postman, и я не могу получить никакого ответа.
(node:5452) UnhandledPromiseRejectionWarning: Error: data and salt arguments required
at Object.hashSync (C:UsersPCDesktopprojectsmern_loginbackendnode_modulesbcryptbcrypt.js:91:15)
at C:UsersPCDesktopprojectsmern_loginbackendserver.js:64:39
at C:UsersPCDesktopprojectsmern_loginbackendnode_modulesmongooselibmodel.js:4866:16
at C:UsersPCDesktopprojectsmern_loginbackendnode_modulesmongooselibmodel.js:4866:16
at C:UsersPCDesktopprojectsmern_loginbackendnode_modulesmongooselibhelperspromiseOrCallback.js:24:16
at C:UsersPCDesktopprojectsmern_loginbackendnode_modulesmongooselibmodel.js:4889:21
at C:UsersPCDesktopprojectsmern_loginbackendnode_modulesmongooselibquery.js:4399:11
at C:UsersPCDesktopprojectsmern_loginbackendnode_moduleskareemindex.js:136:16
at processTicksAndRejections (internal/process/task_queues.js:79:11)
(node:5452) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1)
(node:5452) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
Я не знаю, что я делаю не так, я просто пытаюсь асинхронно вызвать метод хеширования для хеширования моего пароля.
Ответ №1:
Похоже req.body.password
, это undefined
вызывает ошибку.
Проверьте, отправляется ли пароль в теле запроса.
Комментарии:
1. Да, он передает его. Проблема заключается в том, что когда я пытаюсь зарегистрировать пользователя без хеширования, все работает хорошо
2. Ну, это не так. Я только что заглянул в свою базу данных, и даже если я создал пользователя, он существует без имени пользователя и пароля, я не знаю почему. я обновил свой пост с помощью своего пользовательского кода
3. Можете ли вы опубликовать код интерфейса, создающий запрос? Похоже, он не отправляет
password
тело запроса.4. У меня еще нет интерфейса. Я использую postman для тестирования запросов. Я отправил свой запрос postman
5. Ну, я исправил свою проблему, узнав, как я просто пробовал случайные решения. Вероятно, у меня была какая-то проблема с синтаксическим анализом или заголовками postman. Спасибо, что пытались мне помочь.