如何在Express應用程式中獲得登錄的用戶。我想知道哪個用戶創建了帖子。這是我的Post.js模型:
const postsSchema = mongoose.Schema(
{
user: {
type: mongoose.Schema.Types.ObjectId。
required: true,
ref: 'User'。
},
title: {
type: String,
required: true,
},
description: {
type: String,
required: true,
},
image: {
type: String,
required: true,
},
category: {
type: String,
required: true,
},
numLikes: {
type: Number,
required: true。
default: 0,
},
comments: [commentSchema],
},
{
timestamps: true,
}
);
這是我的authUser函式,我用電子郵件和密碼登錄用戶:
這是我的authUser函式。
const authUser = async (req, res)=> {
const { email, password } = req.body;
const user = await User.findOne({ email })。
if (user && (await user.matchPassword(password)) {
res.json({
_id: user._id,
name: user.name,
email: user.email,
isAdmin: user.isAdmin。
token: generateToken(user._id) 。
});
} else {
res.status(401)。
throw new Error('Invalid email or password')。
}
};
generateToken函式是JWT:
。import jwt from 'jsonwebtoken';
const generateToken = id => {
return jwt.sign({ id }, 'abc123', {
expiresIn: '30d',
});
};
export default generateToken;
當我創建帖子時,我想知道是誰創建的用戶,這是我的創建帖子功能:
const createPost = async (req, res)=> {
const post = new Post({
user: req.user._id,
title: '樣本標題'。
description: 'Sample Desc',
image: '/images/sample.jpeg',
category: '樣品類別'。
numLikes: 0,
});
const createPost = await post.save()。
res.status(201).json(createPost)。
};
當我試圖創建帖子時,我在控制臺中得到了這樣的錯誤:
UnhandledPromiseRejectionWarning。TypeError: 不能讀取屬性'_id' of undefined。
我可以用postman登錄,我可以注冊,我可以通過id獲得用戶。如何告訴我的應用程式,我是登錄的用戶,并且可以訪問req.user物件
。uj5u.com熱心網友回復:
你需要讓客戶端將令牌送回給你,然后你對其進行驗證(通常是通過影響端點的某些部分的中間件,這樣你就不必在單個端點中呼叫驗證函式)。
相反,如果 express 也是您的前端,那么您需要使用 express-session 這樣的庫https://www.npmjs.com/package/express-session來管理 cookie。在他們的頁面上有一個很好的例子:
。
// use the session middleware.
app.use(session({ secret: '鍵盤貓', cookie: { maxAge: 60000 }}))
// access the session as req.session.
app.get('/'/span>, function(req, res, next) {
if (req.session.views) {
req.session.views
res.setHeader('Content-Type'/span>, 'text/html'/span>)
res.write('<p> views: ' req.session.views '</p> ' )
res.write('<p> expires in: (req.session.cookie.maxAge / 1000) 's</p>')
res.end()
} else {
req.session.views = 1.
res.end('歡迎來到會話演示。重繪 !')
}
})
否則,你已經將令牌發送給了客戶端,但卻沒有做任何處理。
uj5u.com熱心網友回復:
你是否需要一個這樣的中間件:
module.exports = (req, res, next) => /span> {
// Authorization token example: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwiaWQiOiIxIwiaWF0IjoxNTE2MjM5MDIyfQ.dYo0kOIhum5mMTRV8CAn8gQ_6aqoDQLE--vCZD4E-fg
const { authorization } = req.headers
if (!authorization) return res.send({ message: 'Token not provided', code: 400 })
const [ schema, token ] = authorization.split(' '/span>)
if (schema !== 'Bearer') return res.send({ message: 'Token is bad formated', code: 400 })
if (!token) return res.send({ message。'Invalid token', code: 400})
jwt.verify(token, 'abc123', (error, decoded) => /span> {
if (error) return res. send({ message: error.message, code: 401})
req.userId = decoded.id。
})
next()
}
希望這對你有幫助。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/327668.html
標籤:
