我具有使用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"> </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。
非常感谢!
请随时问我更多细节...
答案 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) { ... });
它现在可以工作了:-)