Mongoose .insertOne() 不工作(没有给出错误信息)

Posted

技术标签:

【中文标题】Mongoose .insertOne() 不工作(没有给出错误信息)【英文标题】:Mongoose .insertOne() not working (no error message given) 【发布时间】:2022-01-17 23:08:28 【问题描述】:

我正在使用 node.js 编写一个简单的登录/注册程序,该程序将帐户详细信息(用户名、电子邮件和密码)存储在 MongoDB 数据库中。我已经确定我已经正确下载了 MongoDB,但我无法弄清楚我的代码有什么问题......没有抛出任何错误,但 nameemailhashedPassword 没有出现插入用户数据库。

这是我的 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()方法有什么区别?

Mongoose.connect 不工作

将图像文件从 React 前端上传到 Node/Express/Mongoose/MongoDB 后端(不工作)

findOneAndDelete Mongoose 不工作 MER​​N 堆栈

.insertOne 不是函数