大家好,我正在做我的第一個全堆疊 MERN 應用程式,我一直在嘗試檢查資料庫中是否已經存在用戶(通過 .exec() 或使用回呼函式),但我一直遇到請求錯誤(500 等),代碼如下。我需要你的幫助天才!!!!
'userModel.js'
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
// new user model for mongo
const UserSchema = new Schema({
username: {
type: String,
required: true,
},
password: {
type: String,
required: true
}
},
{
collection: 'users'
})
module.exports = User = mongoose.model('user', UserSchema);
'users.js'
const express = require('express')
const router = express.Router()
const userModel = require('../models/userModel')
const mongoose = require('mongoose')
// POST users to db
router.post('/', (req,res) =>{
// new instance of user model to be mutated
const User = new userModel({
// grabbing user register data and pushing to mongo
username: req.body.username,
password: req.body.password
})
// checking if user already exists
User.findOne({username: req.body.username}, async function(err, user){
if (err) {
console.log(err);
}
if(user){
console.log('user exists')
}
else{
const newUser = await user.save()
res.json(newUser)
console.log("username: " req.body.username ", password: " req.body.password)
/*catch (err) {
err => {res.json({message: err.message})}
}*/
}
})
})
module.exports = router;
'app.js'
// Connect to database
const db = require('./bin/mongoURI').mongoURI;
mongoose
.connect(db, {
useNewUrlParser: true,
useUnifiedTopology: true,
})
.then(() => console.log('CONNECTED TO MONGODB'))
.catch(err => console.log(err));
uj5u.com熱心網友回復:
您的代碼有一些問題,以下是解釋:
1)利用mongoose框架
unique您可以利用mongoose 的屬性,而不是搜索存在于同一用戶名下的用戶。它不允許您發布username資料庫中已經存在的用戶。
這樣,您就可以擺脫您的呼叫,findOne()從而減少端點的總回應時間。你可以在這里閱讀更多。
您的架構將如下所示:
const UserSchema = new Schema({
username: {
type: String,
required: true,
unique: true // here
},
password: {
type: String,
required: true
}
},
{
collection: 'users'
})
2)不要混淆Model和Document
在您的users.js檔案中,您寫道:
const User = new userModel({
// grabbing user register data and pushing to mongo
username: req.body.username,
password: req.body.password
})
// checking if user already exists
User.findOne({username: req.body.username}, [...]
通過撰寫const User = new userModel([....]),您宣告了一個檔案,它是模型的一個實體。在下一行,您嘗試呼叫findOne()此檔案上的方法,但由于這是模型中的方法,因此該方法永遠不會起作用。您可以在此處閱讀更多相關資訊。
你應該改寫:
const User = new userModel({
username: req.body.username,
password: req.body.password
})
// NOTE HERE the use of userModel, instead of User
userModel.findOne({username: req.body.username}, [...]
3) async/await、try/catch 以及我將如何撰寫您的router.post路線
您在使用callback語法的同時也在使用async/await語法:
User.findOne({username: req.body.username}, async function(err, user){[...]
這非常令人困惑。
現在,我不知道這兩者的結合是否可能,因為我從未嘗試過,但這可能是錯誤的來源。我建議根據自己的喜好堅持兩者之一(盡管我更喜歡async/await我自己)。
即使代碼執行程序中出現問題,您也可以利用try/catch塊來優雅地處理錯誤并向用戶發送反饋。
這是一個完整的例子(未經測驗,請注意)我將如何完成它,保持你的大部分結構不會讓你感到困惑:
// Note the use of async right before (req,res)
router.post('/', async (req,res) => {
try {
// You don't actually need to precisely fill the constructor, mongoose will complain if anything is out of place
const User = new userModel(req.body);
const newUser = await user.save();
console.log("username: " req.body.username ", password: " req.body.password);
res.json(newUser);
} catch (err) {
// Handle here any kind of problem, be it ValidationError or more
return res.status(400).send({error: 'Oops, something went wrong'});
}
});
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/428891.html
