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 不存在
Errr 'mongo.js:L112 错误:无法在 src/mongo/shell/mongo.js:L112 连接到服务器 127.0.0.1:27017'