我正在尝试开发一个简单的Web应用程序,其中1个用户可以订购tea,管理员用户可以看到此订单。您能帮我解决我的问题吗: 我可以将茶添加到DB中,但是它消失了,计数又从0开始。我尝试首先仅对数据库中的一个用户执行此操作。 非常感谢您的帮助!
这是我的: app.js:
var mongoose = require("mongoose");
var passport = require("passport");
var bodyParser = require("body-parser");
var User = require("./models/user");
var LocalStrategy = require("passport-local");
var passportLocalMongoose = require("passport-local-mongoose");
mongoose.connect("mongodb://localhost/hairsalon_db");
var app = express();
app.set('view engine', 'ejs');
app.use(bodyParser.urlencoded({extended: true}));
app.use(bodyParser.json());
app.use(require("express-session")({
resave: false,
saveUninitialized: false
}));
app.use(passport.initialize());
app.use(passport.session());
app.use(express.static('scripts'));
passport.use(new LocalStrategy(User.authenticate()));
passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());
app.post("/tea_added", function(req, res){
const click = {clickTime: new Date()};
console.log(click);
User.find({}, function(err, foundData) {
database = foundData[0];
console.log(foundData[0]);
foundData[0].tea = foundData[0].tea + 1;
console.log(foundData[0]);
});
});
...
这是我的UserSchema:
var mongoose = require("mongoose");
var passportLocalMongoose = require("passport-local-mongoose");
var UserSchema = new mongoose.Schema({
username: String,
password: String,
tea: {type: Number, default: 0},
coffee: {type: Number, default: 0}
});
UserSchema.plugin(passportLocalMongoose);
module.exports = mongoose.model("User", UserSchema);
这是我的html页面:
<h1>
Hello, user
</h1>
<button id="add_tea">Add tea</button>
<button id="add_coffee">Add coffee</button>
<script src="add_products.js"></script>
这是一个add_products.js脚本:
const button = document.getElementById('add_tea');
button.addEventListener('click', function(e) {
console.log('tea added');
单击“添加茶”两次后,在终端中输出:
{ clickTime: 2019-12-23T17:58:13.926Z }
{ tea: 0,
coffee: 0,
_id: 5df9500dcacf170631a3ce72,
username: 'test2',
__v: 0 }
{ tea: 1,
coffee: 0,
_id: 5df9500dcacf170631a3ce72,
username: 'test2',
__v: 0 }
再次单击
{ clickTime: 2019-12-23T17:58:31.675Z }
{ tea: 0,
coffee: 0,
_id: 5df9500dcacf170631a3ce72,
username: 'test2',
__v: 0 }
{ tea: 1,
coffee: 0,
_id: 5df9500dcacf170631a3ce72,
username: 'test2',
__v: 0 }
答案 0 :(得分:0)
您只是updating
个文档,但没有将其保存到数据库。 find
命令从数据库中获取文档,因此您需要在更新后调用.save()
。
Just add the below line
app.post("/tea_added", function(req, res){
const click = {clickTime: new Date()};
console.log(click);
User.find({}, function(err, foundData) {
database = foundData[0];
console.log(foundData[0]);
foundData[0].tea = foundData[0].tea + 1;
//Add the below mentioned line
User.save(function (err) {
if(err) {
console.error('ERROR!');
}
});
});
});
答案 1 :(得分:0)
首先,创建计数器文档以存储最后一个序列。之后,对tea
var mongoose = require("mongoose");
var passportLocalMongoose = require("passport-local-mongoose");
var CounterSchema = new mongoose.Schema({
slug: {type: String, default: 'tea'},
seq: {type: Number, default: 0}
});
var Counter = mongoose.model('Counter', CounterSchema);
const UserSchema = new mongoose.Schema({
username: String,
password: String,
tea: {type: Number, default: 0},
coffee: {type: Number, default: 0}
});
UserSchema.pre('save', function(next) {
var doc = this;
Counter.findByIdAndUpdate({_id: 'tea'}, {$inc: { seq: 1} }, function(error, counter) {
if(error)
return next(error);
doc.tea = counter.seq;
next();
});
});
UserSchema.plugin(passportLocalMongoose);
module.exports = mongoose.model("User", UserSchema);
答案 2 :(得分:0)
请选中.findOneAndUpdate(),这有助于您在一个数据库调用中完成操作:
var mongoose = require("mongoose");
var passport = require("passport");
var bodyParser = require("body-parser");
var User = require("./models/user");
var LocalStrategy = require("passport-local");
var passportLocalMongoose = require("passport-local-mongoose");
mongoose.connect("mongodb://localhost/hairsalon_db");
var app = express();
app.set('view engine', 'ejs');
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
app.use(require("express-session")({
resave: false,
saveUninitialized: false
}));
app.use(passport.initialize());
app.use(passport.session());
app.use(express.static('scripts'));
passport.use(new LocalStrategy(User.authenticate()));
passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());
app.post("/tea_added", function (req, res) {
const click = { clickTime: new Date() };
console.log(click);
/** 1) Let's say you get username of user
& order details here i.e; tea :1 && coffee : 2 like
Example object : req.body = {
username: 'myName',
coffee: 1,
tea: 2
};
(Or)
req.body = {
username: 'myName',
tea: 1
};
*/
const userName = req.body.username;
let inputValues = {};
inputValues.coffee = (req.body.coffee) ? req.body.coffee : 0
inputValues.tea = (req.body.tea) ? req.body.tea : 0
// `new: true` is to return newly updated document from DB. In case if no document matches with passed in username then o/p will be null.
User.findOneAndUpdate({ "username": userName }, { $inc: inputValues }, { new: true}).lean(true).exec((err, res) => {
if (err) { /** some logic or throw err */ console.error('DB Error') }
if (res) { /** Send success response */console.log('order added') }else{/** some logic or throw err */ console.error('unable to update/process order')}
});
});