我創建了一些示例代碼來在較小的范圍內演示我的問題。如果可能的話,我想要一個不涉及向我的模型添加“unique: true”的解決方案,因為我似乎在許多不同的場景中遇到了類似的問題:
const express = require('express')
const mongoose = require('mongoose')
const app = express()
const PORT = 6000
app.use(express.json())
// Initializing mongoose model and connection
const SampleSchema = mongoose.Schema({
username: String,
password: String
})
const Sample = mongoose.model('sample', SampleSchema)
mongoose.connect('mongodb://localhost/testdatabase', {
useNewUrlParser: true,
useUnifiedTopology: true
})
// Running my post request
app.post('/api', async (req, res) => {
await Sample.findOne({
username: req.body.username
}).then(data => {
if(data) {
console.log(data)
return res.json('This user already exists in my database')
}
})
await Sample.create({
username: req.body.username,
password: req.body.password
})
return res.json('User created')
})
app.listen(PORT, () => {
console.log('Server running on 6000')
})
這是我第一次發送請求時的請求和資料庫:

這是預期的。但是,如果我第二次發送相同的請求:

如果執行該行代碼,我希望代碼在第一個“res.json”處停止 - 基本上,在本示例中,如果已存在具有相同用戶名的示例,我不想創建新示例。我確實意識到在這種情況下我可以以不同的方式解決問題來解決問題,但我想知道為什么我的“Sample.create”行會運行,以及是否有辦法防止它在上述方法之外運行。
uj5u.com熱心網友回復:
這是因為.then回呼在封閉函式已經完成之后執行。在此代碼中:
await Sample.findOne({
username: req.body.username
}).then(data => {
if(data) {
console.log(data)
return res.json('This user already exists in my database')
}
})
回傳的函式是data => ...傳遞給的箭頭函式.then,而不是封閉的請求處理程式,因此它不會阻止后續代碼的執行。
您還想重寫該位以使用 async/await 語法:
const data = await Sample.findOne({
username: req.body.username
})
if(data) {
console.log(data)
return res.json('This user already exists in my database')
}
您可能需要閱讀一些關于 async/await 和 Promise 的一般資訊——異步代碼一開始可能會很混亂!https://developers.google.com/web/fundamentals/primers/async-functions
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/321273.html
