这是我的 user.js 文件,我在其中处理两个请求。
首先 POST / signup ,用户在其中输入电子邮件和密码,以便我可以将其存储在mongodb中。
var express = require("express");
const router = express.Router();
const mongoose = require("mongoose");
var bcrypt = require("bcrypt");
var jwt = require("jsonwebtoken");
var User = require("../models/user");
router.post("/signup", (req, res, next) => {
User.find({ email: req.body.email })
.exec()
.then(user => {
if (user.length >= 1) {
return res.status(409).json({
message: "Mail exists"
});
} else {
bcrypt.hash(req.body.password, 10, (err, hash) => {
if (err) {
return res.status(500).json({
error: err
});
} else {
const user = new User({
_id: new mongoose.Types.ObjectId(),
email: req.body.email,
password: hash
});
user
.save()
.then(result => {
console.log(result);
res.status(201).json({
message: "User created"
});
})
.catch(err => {
console.log(err);
res.status(500).json({
error: err
});
});
}
});
}
});
});
第二个 POST / login ,用户在其中输入电子邮件,然后比较密码和bcrypt(如果密码与数据库中的密码匹配)。
router.post("/login", (req, res, next) => {
User.find({ email: req.body.email })
.exec()
.then(user => {
if (user.length < 1) {
return res.status(401).json({
message: "Auth failed"
});
}
bcrypt.compare(req.body.password, user[0].password, (err, result) => {
if (err) {
return res.status(401).json({
message: "Auth failed"
});
}
if (result) {
const token = jwt.sign(
{
email: user[0].email,
userId: user[0]._id
},
process.env.JWT_KEY,
{
expiresIn: "1h"
}
);
return res.status(200).json({
message: "Auth successful",
token: token
});
}
res.status(401).json({
message: "Auth failed"
});
});
})
.catch(err => {
console.log(err);
res.status(500).json({
error: err
});
});
});
问题如下::每当我尝试使用邮递员创建用户 /注册时,请求均停留在“正在加载”状态,并且服务器关闭。
POSTMAN正文: { 'emial':'teste@gmail.com', '密码':'12345' }
服务器中的错误: UnhandledPromiseRejectionWarning:MongoNetworkError:首次连接时无法连接到服务器[node-rest-shop-shard-00-01-pbcph.azure.mongodb.net:27017]上的连接[MongoNetworkError:连接4到node-rest-shop-shard-00 -01-pbcph.azure.mongodb.net:27017超时]
(节点:1496)UnhandledPromiseRejectionWarning:未处理的承诺拒绝。引发此错误的原因可能是抛出了一个没有catch块的异步函数,或者是拒绝了一个.catch()无法处理的承诺。 (拒绝ID:1)
(节点:1496)[DEP0018] DeprecationWarning:已弃用未处理的承诺拒绝。将来,未处理的承诺拒绝将以非零退出代码终止Node.js进程。
答案 0 :(得分:0)
User.find
承诺被拒绝,因为Node无法连接到您的MongoDB实例。这个被拒绝的承诺将尝试执行遇到的第一个错误处理程序。在您的情况下,它找不到任何catch()来处理此错误。您可以通过在最后的Promise链中添加catch()来避免这种情况。
您还应该研究为什么Node实例无法成功连接到MongoDB实例。
router.post("/signup", (req, res, next) => {
User.find({ email: req.body.email })
.exec()
.then(user => {
if (user.length >= 1) {
return res.status(409).json({
message: "Mail exists"
});
} else {
bcrypt.hash(req.body.password, 10, (err, hash) => {
if (err) {
return res.status(500).json({
error: err
});
} else {
const user = new User({
_id: new mongoose.Types.ObjectId(),
email: req.body.email,
password: hash
});
user
.save()
.then(result => {
console.log(result);
res.status(201).json({
message: "User created"
});
})
.catch(err => {
console.log(err);
res.status(500).json({
error: err
});
});
}
});
}
}).catch(err => { //Handle the error here.
console.log(err);
res.status(500).json({
error: err
});
});
});
您应该对登录呼叫执行相同的操作。