對于使用 bcrypt 在節點中進行用戶身份驗證,我有以下代碼,但是當我嘗試使用 postman api 發布時出現錯誤,錯誤是 "message": "Illegal arguments: string, undefined"
通過郵遞員發送的資料是
{
"password":"1234",
"email":"[email protected]"
}
我找不到代碼有什么問題,你能幫我解決這個問題嗎?
這是 server.js 的代碼
import express from 'express';
import userdata from './userdata.js';
import mongoose from 'mongoose';
import userrouter from './routers/userrouter.js';
import productRouter from './routers/productrouter.js';
const app=express();
mongoose.connect(process.env.MONGODB_URL || 'mongodb://localhost:27017/purpleshades',{
useUnifiedTopology: true,
useNewUrlParser: true
})
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.get('/users/api/:id',(req,res)=>{
const k=parseInt(req.params.id)
const user1=userdata.users.find((x)=>x.uID===k)
const cartinfo=user1.ucart
const cartproductlist=[]
for (let i = 0; i < cartinfo.length; i ) {
const pid = cartinfo[i];
const productreal = data.products.find((x) => x.id === pid );
cartproductlist.push(productreal)
}
res.send(cartproductlist)
})
app.use('/api/users',userrouter)
app.use('/api/products',productRouter)
app.use((err,req,res,next)=>{
res.status(500).send({message:err.message})
})
const port=process.env.PORT || 5000
app.listen(5000,()=>{
console.log(`serve at http://localhost:${port}`);
})
userrouter.js 的代碼
import express from "express";
import userdata from "../userdata.js";
import User from "../models/usermodel.js";
import expressAsyncHandler from "express-async-handler";
import bcrypt from 'bcryptjs'
const userrouter=express.Router()
userrouter.get('/seed',expressAsyncHandler( async(req,res)=>{
const createdusers=await User.insertMany(userdata.users)
res.send({createdusers})
}))
userrouter.post('/signin',expressAsyncHandler(async(req,res)=>{
const user=User.findOne({email: req.body.email})
if(user){
if(bcrypt.compareSync(req.body.password,user.password)){
res.send({
_id:user._id,
name:user.name,
isAdmin:user.isAdmin,
})
return
}
}
res.status(401).send({message:'invalid Email or Password'})
}))
export default userrouter
usermodel.js 的代碼
import mongoose from "mongoose";
const userschema=new mongoose.Schema(
{
name:{type:String,required:true},
email:{type:String,required:true,unique:true},
password:{type:String,required:true},
isadmin:{type: Boolean,required:true ,default:false}
},
{
timestamps:true
}
)
const User=mongoose.model('User',userschema)
export default User
uj5u.com熱心網友回復:
該findOne函式是異步的,因此這一行為變數分配了一個承諾user:
const user=User.findOne({email: req.body.email})
由于一個承諾是真實的,這將繼續呼叫compareSync,但承諾沒有password屬性:
if(user){
if(bcrypt.compareSync(req.body.password,user.password)){
等待 findOne 的結果以獲取檔案而不是承諾。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/408422.html
標籤:
