Mongoose .insertOne() 不工作(没有给出错误信息)
Posted
技术标签:
【中文标题】Mongoose .insertOne() 不工作(没有给出错误信息)【英文标题】:Mongoose .insertOne() not working (no error message given) 【发布时间】:2022-01-17 23:08:28 【问题描述】:我正在使用 node.js 编写一个简单的登录/注册程序,该程序将帐户详细信息(用户名、电子邮件和密码)存储在 MongoDB 数据库中。我已经确定我已经正确下载了 MongoDB,但我无法弄清楚我的代码有什么问题......没有抛出任何错误,但 name
、email
和 hashedPassword
没有出现插入用户数据库。
这是我的 server.js 文件中的代码:
if (process.env.NODE_ENV !== 'production')
require('dotenv').config()
const express = require('express')
const app = express()
const bcrypt = require('bcrypt')
const passport = require('passport')
const flash = require('express-flash')
const session = require('express-session')
const methodOverride = require('method-override')
const userArray = [];
const mongoose = require('mongoose')
mongoose.connect(process.env.DATABASE_URL, useNewUrlParser: true )
const db = mongoose.connection
db.on('error', error => console.error(error))
db.once('open', () => console.log('Connected to Mongoose'))
const initializePassport = require('./passport-config')
initializePassport(
passport,
email => users.find(user => user.email === email),
id => users.find(user => user.id === id)
)
app.set('view-engine', 'ejs')
app.use(express.urlencoded( extended: false ))
app.use(flash())
app.use(session(
secret: process.env.SESSION_SECRET,
resave: false,
saveUninitialized: false
))
app.use(passport.initialize())
app.use(passport.session())
app.use(methodOverride('_method'))
app.get('/', checkAuthenticated, (req, res) =>
res.render('index.ejs', name: req.user.name )
)
app.get('/login', checkNotAuthenticated, (req, res) =>
res.render('login.ejs')
)
app.post('/login', checkNotAuthenticated, passport.authenticate('local',
successRedirect: '/',
failureRedirect: '/login',
failureFlash: true
))
app.get('/register', checkNotAuthenticated, (req, res) =>
res.render('register.ejs')
)
//**THE PROBLEM IS SOMEWHERE HERE I THINK**
app.post('/register', checkNotAuthenticated, async (req, res) =>
console.log("Before try")
try
const hashedPassword = await bcrypt.hash(req.body.password, 10)
console.log("Password hashed")
userArray.push(
name: req.body.name,
email: req.body.email,
password: hashedPassword
)
console.log("pushed to array")
db.users.insertOne(
"name": req.body.name,
"email": req.body.email,
"password": hashedPassword
)
console.log("New user loaded to DB!")
console.log(req.body.name);
console.log(req.body.email);
console.log(hashedPassword);
res.redirect('/login')
catch
res.redirect('/register')
)
app.delete('/logout', (req, res) =>
req.logOut()
res.redirect('/login')
)
function checkAuthenticated(req, res, next)
if (req.isAuthenticated())
return next()
res.redirect('/login')
function checkNotAuthenticated(req, res, next)
if (req.isAuthenticated())
return res.redirect('/')
next()
app.listen(3000)
我在app.post('/register', checkNotAuthenticated, async (req, res) =>
部分遇到问题
我记录了它的每一步,这就是控制台中出现的内容:
[nodemon] restarting due to changes...
[nodemon] starting `node server.js`
Connected to Mongoose
Before try
Password hashed
pushed to array
所以,如您所见,除了将用户信息插入数据库外,一切正常(我也知道,因为在 Mongo shell 中运行 db.users.find() 不会返回任何结果)...请帮助 :'(
【问题讨论】:
db.users.insertOne
- 这不是 Mongoose ODM 文档的常用语法 - Mongoose 使用 Schema 和 Model 以及相关方法
但是这里说 (w3schools.com/nodejs/nodejs_mongodb_insert.asp) .insertOne()
可以在 node.js 中用于将数据插入数据库...我应该使用什么语法来代替 .insertOne()
?
那个(链接)不是指的是 Mongoose API。它是MongoDB NodeJS Driver.。
【参考方案1】:
将用户信息添加到用户数据库时出现语法错误。而不是:
db.users.insertOne(
"name": req.body.name,
"email": req.body.email,
"password": hashedPassword
)
应该是:
db.collection("users").insertOne(
"name": req.body.name,
"email": req.body.email,
"password": hashedPassword
)
【讨论】:
以上是关于Mongoose .insertOne() 不工作(没有给出错误信息)的主要内容,如果未能解决你的问题,请参考以下文章
使用第三方包mongoose来操作MongoDB数据库,解决报错:MongooseError
insert(),insertOne()和insertMany()方法有什么区别?
将图像文件从 React 前端上传到 Node/Express/Mongoose/MongoDB 后端(不工作)