我无法获取令牌变量

时间:2019-11-21 19:00:14

标签: node.js reactjs

我具有使用MongoDB进行令牌验证的功能,该功能可以将其保存到应用逻辑的最后一步(并且可以完美保存)

async confirmationPost (req, res) {
    // find the token
    const token = req.body.token;
    await Token.findOne({ token }, function (token) {
        if (!token) return res.status(),
        console.log(token),
        console.log('We cannot find this token.'),

        // After find the token, find the user
        User.findOne({ _id: token._userId, token: req.body.token }, function (err, user) {

            if (!user) return res.status(400).send(body),
                console.log('Coudn't find this user.');

            if (user.isVerified) return res.status(400).send({ 
                type: 'already-verified', msg: 'User already verified.' 
                },
                console.log('Already Verified.')
            );

            // Verify and save
            user.isVerified = true;
            user.save(function (err) {
                if (err) { return res.status(500).send({ msg: err.message }); }
                res.status(200).send('Verified, just login.');
                },
                console.log('Verified, just login.')
            );
        });
    });
}

但是由于某些我不理解的原因,在后端console.log(token)中返回null时显示console.log('We cannot find this token.'),此时应用程序崩溃,并显示以下消息: TypeError:无法读取null的属性“ _userId”

前端在React中,这是它的代码:

import React, { useState } from "react";
import api from '../../services/api';

export default function Check({ history }) {

    const [token, setToken] = useState('');

    async function confirmationPost (event) {
        event.preventDefault();

        const response =  await api.post('/confirm', {
            token: token,
        })

        // history.push('/profile');
    }

    return (
        <>  
            <p className="big">Coloque o token <strong>que você recebeu via email</strong> no campo abaixo abaixo.</p>

            <form onSubmit={confirmationPost}>

                <input 
                type="txt" 
                id="token" 
                placeholder="Coloque o token de verficação aqui, pfvr..."
                value={token}
                onChange={event => setToken(event.target.value)}
            >
            </input>

            <p className="little">&nbsp;</p>

            <button className="btn" type="Submit">Verificar token</button>

            </form>

            <p className="little"></p>
            <p className="little">Precisa receber outro token de verificação? Clique bem <strong>aqui</strong>.</p>

        </>
    )
}

还有我的令牌模型:

const mongoose = require('mongoose');

const TokenSchema = new mongoose.Schema({
    _userId: { type: mongoose.Schema.Types.ObjectId, required: true, ref: 'User' },
    token: { type: String, required: true },
    createdAt: { type: Date, required: true, default: Date.now, expires: 86400 }
});

module.exports = mongoose.model('Token', TokenSchema);

我正在使用 后端使用NodeJS 10.16.3,Mongoose 5.7.6和Cors 2.8.5,前端使用Axios 0.19.0。

非常感谢!

请随时问我更多细节...

2 个答案:

答案 0 :(得分:0)

根据mongoose

  

使用回调函数执行查询时,可以将查询指定为JSON文档。 JSON文档的语法与MongoDB Shell相同。

因此,我相信在{token}中进行findOne可能行不通。

尝试像这样替换它

 await Token.findOne({ token:token }, function (token) {
  //Callback Logic
})

此外,console.log('We cannot find this token.')总是会被打印,因为它的after return语句可以解决此问题

 await Token.findOne({ token:token }, function (token) {
      if(!token){
        console.log('We cannot find this token.')
        return res.status(404)

     } else{
          //Rest of the logic
      }

})

答案 1 :(得分:0)

解决方案是组织逻辑!!!首先,我检查是否所有信息都在req中,然后将其转换为变量:

const token_ = req.body.token;

在那之后,我将其加载到函数中并重新命名以清楚起见,并在token中重新构建Token.findOne()

await Token.findOne({ token:token_ }, function (err, tokenData)

当然,我将(!token)更改为(!tokenData)。最后,在User.findOne之前,我从tokenData中提取了用户ID并将其传递给函数:

tokenUser = tokenData._userId;
User.findOne({ _id: tokenUser }, function (err, user) { ... });

它现在可以工作了:-)