【发布时间】:2022-01-27 19:35:31
【问题描述】:
正如标题所说,我有问题。我将向您展示 NodeJS 中的代码。请求是 blogRouter.delete
controllers/blog.js(仅删除方法)
const blogsRouter = require('express').Router()
const jwt = require('jsonwebtoken');
const Blog = require('../models/blog')
const User = require('../models/user')
blogsRouter.delete('/:id', async (request, response, next) => {
const token = getTokenFrom(request)
console.log('token: ',token)
try {
const decodedToken = jwt.verify(token, process.env.SECRET)
if (!token || !decodedToken.id) {
return response.status(401).json({ error: 'token missing or invalid' })
}
const userid = await User.findById(decodedToken.id)
const blogs = await Blog.findById(request.params.id)
if(blogs.user.toString() === userid.toString()) {
await Blog.findByIdAndRemove(request.params.id)
response.status(204).end()
} else {
response.status(404).end()
}
}catch(exception){next(exception)}
})
当我控制台日志令牌时,我通过辅助函数 getTokenFrom 得到 null
getTokenFrom
const getTokenFrom = request => {
const authorization = request.get('authorization')
if (authorization && authorization.toLowerCase().startsWith('bearer ')) {
return authorization.substring(7)
}
return null
}
在发布请求令牌中工作得很好。我能够创建一个博客。但是当我用删除方法做同样的事情时,它不会显示令牌。它说它的 null。所以它正确地返回了我的 getTokenFrom 函数,但我希望能够在 delete 方法中访问令牌,这样我就可以删除某些博客。
控制器/登录
const jwt = require('jsonwebtoken')
const bcrypt = require('bcryptjs')
const loginRouter = require('express').Router()
const User = require('../models/user')
loginRouter.post('/', async (request, response) => {
const body = request.body
const user = await User.findOne({username: body.username})
const passwordCorrect = user == null ?
false : await bcrypt.compare(body.password, user.passwordHash)
if(!(user && passwordCorrect)) {
return response.status(401).json({
error: "Invalid username or passowrd"
})
}
const userForToken = {
username: user.username,
id: user._id,
}
const token = jwt.sign(userForToken, process.env.SECRET)
response.status(200).send({token, username: user.username, name: user.name})
})
module.exports = loginRouter
https://prnt.sc/qfjgka --> 这是一张图片。我发送 http.delete 请求,我得到令牌 null。必须提供 JWT。我不知道是我的错。我尝试了很多东西,但它不会工作。 我试图用 token.request.jwt 定义令牌,但后来我得到它未定义。
我只需要在 blogRoute.delete 方法中以某种方式访问该令牌。
感谢转发
编辑:这是我的 post 方法,当我在此处控制台日志令牌时,它会返回令牌的值,但是当我在 delete 方法中执行相同操作时,它将不起作用
blogsRouter.post('/', async (request, response, next) => {
const body = request.body
console.log('body', body)
const token = getTokenFrom(request)
console.log('token: ', token)
try {
const decodedToken = jwt.verify(token, process.env.SECRET)
if (!token || !decodedToken.id) {
return response.status(401).json({ error: 'token missing or invalid' })
}
const user = await User.findById(decodedToken.id)
const blog = new Blog({
title: body.title,
author: body.author,
url: body.url,
likes: body.likes,
user: user._id
})
const savedBlog = await blog.save()
user.blogs = user.blogs.concat(savedBlog._id)
await user.save()
response.json(savedBlog.toJSON())
} catch(exception) {
next(exception)
}
})
【问题讨论】:
-
您是否在 DELETE 请求的标头中包含 JWT 令牌?鉴于令牌作为登录请求的一部分作为正文的一部分而不是 cookie 传递,这将需要手动完成。
-
我通过这个函数包含它 const getTokenFrom = request => { const authorization = request.get('authorization') if (authorization && authorization.toLowerCase().startsWith('bearer')) { return authorization.substring(7) } return null }
-
但它返回 null 而不是 token
-
在删除请求中,您发送的令牌是否与在发布请求中相同?您可以在删除请求中显示请求标头吗?
-
如何显示请求头?
标签: node.js express jwt http-delete