【问题标题】:Access req.user to save id to mongoDB访问 req.user 将 id 保存到 mongoDB
【发布时间】:2022-02-06 15:24:41
【问题描述】:

我目前在弄清楚如何访问 req.user 时遇到问题,以便我可以获取已登录的用户 ID 并将其与他们保存在网页上的项目一起保存。这样,当他们加载网页时,他们只会得到他们的项目。我知道我可以访问 req.user 的唯一地方是我的 /router/auth.js 文件。我想找出一种在不同的路由器文件中访问它的方法。

router/auth.js

const express = require('express');
const passport = require('passport');
const bodyParser = require('body-parser');
const jwt = require('jsonwebtoken');

const config = require('../config');

const router = express.Router();

const createAuthToken = function (user) {
  return jwt.sign({ user }, config.JWT_SECRET, {
    subject: user.username,
    expiresIn: config.JWT_EXPIRY,
    algorithm: 'HS256'
  });
};

const localAuth = passport.authenticate('local', { session: false });
router.use(bodyParser.json());

router.post('/login', localAuth, (req, res) => {
  const authToken = createAuthToken(req.user.serialize());
  res.json({ authToken });
});

const jwtAuth = passport.authenticate('jwt', { session: false });

router.post('/refresh', jwtAuth, (req, res) => {
  const authToken = createAuthToken(req.user);
  res.json({ authToken });
});

/router/portfolio.js

router.post('/:id', (req, res) => {
  const id = req.params.id;
  const { holdings } = req.body;

  CryptoPortfolio.findOne({ id }, (err, existingCoin) => {
    if (existingCoin === null) {
      getCoins(id)
        .then(x => x[0])
        .then(value =>
          CryptoPortfolio.create({
            id: value.id,
            holdings,
            _creator: this is where I want to add req.user.id
              }).then(() => value))
        .then(newItem => {
          res.status(201).json(newItem);
        })
        .catch(err => {
          console.error(err);
          res.status(500).json({ message: 'Internal server error' });
        });
    } else {
      const capitalizedId = id.charAt(0).toUpperCase() + id.slice(1);
      res.json(`${capitalizedId} already in watchlist`);
    }
  });
});

【问题讨论】:

  • 我认为您可以使用“护照库”进行用户身份验证,默认情况下它会在所有文件中为您提供 req.user 数据。
  • 您可以在您的portfolio.js 文件的路径中访问“req.user”。尝试做 console.log(req.user);你也可以分享你的护照配置文件。
  • @FarhanTahir 我确实尝试过 console.log(req.user),但它给了我未定义的信息。如果我链接 repo 可能会更容易,因为我不确定护照配置文件是什么意思 - github.com/jinesh701/bittrack-server - 与我的问题唯一相关的文件夹是 auth、portfolio 和 server.js

标签: javascript node.js express


【解决方案1】:

您可以定义全局变量并使用中间件使用它。

app.js

// Global Vars
app.use(function (req, res, next) {
    res.locals.user = req.user
    next();
});

route.js

router.get('/', function(req, res) {
    CryptoPortfolio.find({}, function(err, crypto) {
        console.log('CryptoPortfolio : ',crypto);
        res.render('view/crypto', {
            user : res.locals.user   // <= here
        });
    });
});

希望对你有帮助:)

【讨论】:

    【解决方案2】:

    我发现我没有在任何必要的路线上使用下面的代码。实现了它,我现在可以访问 req.user。

    const jwtAuth = passport.authenticate('jwt', { session: false });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-08
      • 1970-01-01
      • 1970-01-01
      • 2012-08-08
      • 2015-05-21
      • 2016-08-10
      相关资源
      最近更新 更多