collection.save() 在 mongodb 中无法正常工作

Posted

技术标签:

【中文标题】collection.save() 在 mongodb 中无法正常工作【英文标题】:collection.save() does not work in mongodb correctly 【发布时间】: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

【问题讨论】:

【参考方案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() 不返回保存的对象,但它会更新现有对象。我希望它对你有用。 不幸的是,它仍然无法正常工作。没有错误,但它没有将我的数据保存到数据库中

以上是关于collection.save() 在 mongodb 中无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

方法 Illuminate\Database\Eloquent\Collection::save 不存在

MongoDB之文档的增删改查

对mongodb文档的基本操作

Errr 'mongo.js:L112 错误:无法在 src/mongo/shell/mongo.js:L112 连接到服务器 127.0.0.1:27017'

JS写mongo命令

使用 Mongo 模板在 Spring Boot 中过滤内部 Arraylist 项的 Mongo 查询