【问题标题】:How to attach user credentials to the request pipeline in expressjs?如何将用户凭据附加到 expressjs 中的请求管道?
【发布时间】:2022-01-16 11:39:59
【问题描述】:

我正在尝试编写一个中间件来提取用户模型并将其附加到请求管道。 我已经编写了一个令牌提取器中间件并设法将令牌附加到请求管道,但由于某种原因,当我尝试提取用户模型时,它在中间件函数内工作正常,但在我的控制器内它返回为未定义。

这是我尝试过的:

utils/middleware.js

const tokenExtractor = async (request, response, next) => {    
        const authorization = await request.get('authorization');
       if (authorization && authorization.toLowerCase().startsWith('bearer ')) {
         request.token = authorization.substring(7);         
       } else{
         request.token = null;
        }
        next();
};

const userExtractor = async (request, response, next) => {  
  tokenExtractor(request, response, next);
  if(request.token){
    const decodedToken = jwt.verify(request.token, process.env.SECRET);    
    request.user = await User.findById(decodedToken.id);
    console.log(request.user); // Works
    next();
  } else{
    response.status(403).json({ error: 'no token received' });
  }
};

在我的控制器内部它发生故障:

controllers/blogs.js

blogRouter.post("/", async (request, response, next) => {
  if (request.body.title && request.body.url) {
    const token = request.token;    
    if (!token) {
      return response.status(401).json({ error: 'invalid token' });
    }
      
    console.log(request.user); // undefined !
    if(!request.user){
      return response.status(401).json({ error: 'invalid user' });
    }
    
    const user = request.user;    
    
    const blog = new Blog({
      title: request.body.title,
      author: request.body.author,
      url: request.body.url,
      likes: request.body.likes,
      user: user._id,
    });

    
    await blog.save();    
    
    user.blogs = user.blogs.concat(blog._id);
    await user.save();
    
    response.status(201).json(blog);
  }
  response.status(400).end();
});

这两个中间件都已附加到 express 应用。

编辑:

我已通过从 userExtractor 函数中删除对 tokenExtractor 的调用来解决此问题,然后将中间件链接到路由器而不是先调用它们。

我在全局使用 tokenExtractor,而在本地使用 userExtractor 到 blogsRouter。发生的事情是,虽然 tokenExtractor 工作正常,但 blogRouters 在 userExtractor 被调用之前就被调用了,因此我没有定义。

app.js

// app.use(tokenExtractor);
app.use(requestLogger);
app.use(errorHandler);
// app.use(userExtractor);

app.use('/api/login', tokenExtractor, loginRouter);
app.use('/api/users', usersRouter);
app.use('/api/blogs', tokenExtractor, userExtractor, blogRouter); // chaining the extractors

【问题讨论】:

    标签: javascript mongodb express mongoose


    【解决方案1】:

    有道理,让next() 将(req, res, next) 实例作为管道 向前传递。不需要任何 hack,您可以根据需要堆叠任意数量的中间件,甚至可以在另一个中间重用值 - 如果您可以信任调用堆栈的顺序。

    【讨论】:

      猜你喜欢
      • 2021-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-02
      • 1970-01-01
      • 2010-09-24
      • 1970-01-01
      • 2016-08-15
      相关资源
      最近更新 更多