首页 > 解决方案 > 添加身份验证后 Express GET 请求不起作用

问题描述

我被困在这个非常简单的问题上,我不知道我做错了什么。我正在创建一个简单RESTAPI的用户和身份验证。这是我试图运行的 GET 请求:

router.get('/users/me',auth ,async(req,res)=>{
console.log(req.user)
console.log('Entered the get request')
res.send(getUserData(req.user)) })

基本上,在身份验证结束时,我将从数据库中获取的用户保存到req.user对象中,然后使用res.send(req.user). 正如您在下面的代码中看到的:

const auth = async(req,res,next)=>{
try{
    const token = req.header('Authorization').replace('Bearer ','')
    const decoded = jwt.verify(token,'secretkey')
    
    const db = req.app.locals.database
    const user = await db.collection('users').findOne({
        _id: decoded.id,
        'tokens.token':token
    })
    console.log(user)
    
    if(!user){
        throw new Error()
    }
    req.user = user 
    next()

}catch(e){
    res.status(401).send('Please Authenticate')
}}

问题是此身份验证功能运行良好。我也在其他路线上使用过它。但是在这个GET请求中,身份验证功能运行(我使用许多控制台日志识别了这一点)并正确获取数据。但是一旦中间件(auth 函数)完成调用,它就不会进入 get 请求。从邮递员那里,当我发送GET请求时,我得到一个404 error,但我不知道为什么。我确实花了几个小时试图理解这一点。如果您知道可能是什么问题,请帮助我。

编辑:所以我能够通过将请求移到我在同一个文件中也有的以下请求之上来运行获取请求:

router.get('/users/:id',auth ,async(req,res)=>{

const id = req.params.id
const db = req.app.locals.database
try{
    
    const result = await db.collection('users').findOne({_id: id})
    const userData = getUserData(result)
    res.status(200).send(userData)
    
}catch(e){
    res.status(404).send()
}

})

但是现在这个请求不起作用。我无法弄清楚定位与请求功能有什么关系。谁能解释一下?

标签: node.jsexpressauthentication

解决方案


推荐阅读