【问题标题】:collection.save() does not work in mongodb correctlycollection.save() 在 mongodb 中无法正常工作
【发布时间】:2020-10-20 03:29:01
【问题描述】:

.save() 没有做任何事情你能帮我解决这个问题吗?这是我的代码 sn-ps

猫鼬连接

const dbOptions = {
  useNewUrlParser: true,
  useUnifiedTopology: true
}

const connection = mongoose.createConnection(process.env.DB_URL, dbOptions, () => { console.log('connected to db') })

const sessionStore = new MongoStore({ mongooseConnection: connection, collection: 'sessions' })

app.use(session({
  secret: process.env.SECRET,
  resave: false,
  saveUninitialized: true,
  store: sessionStore,
  cookie: {
    maxAge: 300
  }
}))

用户架构

const mongoose = require('mongoose')

const UserSchema = new mongoose.Schema({
  username: {
    type: String,
    unique: true,
    required: true
  },
  hash: {
    type: String
  },
  salt: {
    type: String
  }
}, {
  timestamps: true
})

module.exports = mongoose.model('Users', UserSchema)

路由 这里的代码一直执行到我尝试使用控制台语句创建哈希和盐,但没有做任何进一步的事情。

var express = require('express')
var router = express.Router()

const User = require('../models/User')
const passport = require('passport')
const genPassword = require('../passwordUtil').genPassword

/* GET users listing. */
router.get('/', async function (req, res) {
  try {
    const findusers = await User.find()
    res.json(findusers)
  } catch (err) {
    res.json({ message: err })
  }
})

router.post('/register', (req, res) => {
  const salthash = genPassword(req.body.password)

  const hash = salthash.hash
  const salt = salthash.salt

  const user = new User({
    username: req.body.username,
    hash: hash,
    salt: salt
  })

  try {
    const saveduser = user.save()
    res.json(saveduser)
  } catch (err) {
    res.json({ message: err })
  }
})

router.post('/login', passport.authenticate('local'), (req, res, next) => {})

module.exports = router

另外,Idk 如果需要,但这是我的 app.js 文件,如果您发现任何问题,请告诉我。在我看来,这个是健康的,但可以肯定的是。请查看此内容并告诉我。 App.js

var createError = require('http-errors')
var express = require('express')
var path = require('path')
var cookieParser = require('cookie-parser')
var logger = require('morgan')

const mongoose = require('mongoose')
require('dotenv/config')
const bodyparser = require('body-parser')
const cors = require('cors')
const session = require('express-session')
const passport = require('passport')
const MongoStore = require('connect-mongo')(session)
require('./authenticate')

var indexRouter = require('./routes/index')
var usersRouter = require('./routes/users')

var app = express()

// view engine setup
app.set('views', path.join(__dirname, 'views'))
app.set('view engine', 'pug')

app.use(logger('dev'))
app.use(express.json())
app.use(express.urlencoded({ extended: false }))
app.use(cookieParser())
app.use(express.static(path.join(__dirname, 'public')))

app.use(cors())
app.use(bodyparser.json())

const dbOptions = {
  useNewUrlParser: true,
  useUnifiedTopology: true
}

const connection = mongoose.createConnection(process.env.DB_URL, dbOptions, () => { console.log('connected to db') })

const sessionStore = new MongoStore({ mongooseConnection: connection, collection: 'sessions' })

app.use(session({
  secret: process.env.SECRET,
  resave: false,
  saveUninitialized: true,
  store: sessionStore,
  cookie: {
    maxAge: 300
  }
}))

app.use(passport.initialize())
app.use(passport.session())

app.use('/', indexRouter)
app.use('/api/users', usersRouter)

// catch 404 and forward to error handler
app.use(function (req, res, next) {
  next(createError(404))
})

app.use(function (err, req, res, next) {
  res.locals.message = err.message
  res.locals.error = req.app.get('env') === 'development' ? err : {}

  res.status(err.status || 500)
  res.render('error')
})

module.exports = app

【问题讨论】:

    标签: database mongodb mongoose backend mongoose-schema


    【解决方案1】:

    您的代码中有一个小错误。

    我的意思是你的这部分代码:

    try {
        const saveduser = user.save()
        res.json(saveduser)
      } catch (err) {
        res.json({ message: err })
      }
    

    如您所知,与数据库交互是异步节点。因此,如果您想将保存的用户放入savedUser 变量中,您必须使用await。如果您不使用await,您将收到undefined 作为响应。

    这是正确的代码:

    await user.save()
    

    更新

    整个代码会是这样的(使用 async/await):

    router.post('/register', async (req, res) => {
      const salthash = genPassword(req.body.password)
    
      const hash = salthash.hash
      const salt = salthash.salt
    
      const user = new User({
        username: req.body.username,
        hash: hash,
        salt: salt
      })
    
      try {
        await user.save();
        res.json(user);
      } catch (err) {
        res.json({ message: err })
      }
    })
    

    并使用 Promise:

    router.post('/register', (req, res) => {
      const salthash = genPassword(req.body.password)
    
      const hash = salthash.hash
      const salt = salthash.salt
    
      const user = new User({
        username: req.body.username,
        hash: hash,
        salt: salt
      })
    
      user.save().then(() => {
        const savedUser = user;
        res.json(saveduser);
      }).catch(err => {
        res.json({ message: err })
      })
    })
    

    【讨论】:

    • 但 await 仅适用于异步函数。我不认为这是解决问题的方法。
    • 你可以让你的函数异步,或者使用 Promise 或回调。
    • 我考虑的另一件事是 Model.save() 不返回保存的对象,但它会更新现有对象。我希望它对你有用。
    • 不幸的是,它仍然无法正常工作。没有错误,但它没有将我的数据保存到数据库中
    猜你喜欢
    • 2019-08-30
    • 2018-03-10
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-21
    • 2019-06-17
    相关资源
    最近更新 更多