[英]Node JS how to save value to Mongo DB
I am trying to develop simple web application where 1 user can order tea and admin user can see this order.我正在尝试开发简单的 Web 应用程序,其中 1 个用户可以订购茶,而管理员用户可以看到此订单。 Could you please help me to fix my problem: I can add tea to DB, but then it disappears and count starts from 0 again.你能帮我解决我的问题吗:我可以将茶添加到数据库中,但随后它消失了,计数又从 0 开始。 I am trying to do it for only one user in DB first.我试图首先为 DB 中的一个用户执行此操作。 Thanks a lot for your help!非常感谢你的帮助!
Here is my: app.js:这是我的: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]);
});
});
...
Here is my UserSchema:这是我的 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);
Here is my html page:这是我的 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>
Here is a add_products.js script:这是一个 add_products.js 脚本:
const button = document.getElementById('add_tea');
button.addEventListener('click', function(e) {
console.log('tea added');
Output in terminal after clicking 2 times "add tea":单击 2 次“添加茶”后在终端中输出:
{ 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 }
click again再次点击
{ 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 }
You are just updating
the document but not saving it to database.您只是updating
文档而不是将其保存到数据库中。 find
command fetches document from database, so you need to call .save()
after updating it. 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!');
}
});
});
}); });
First, create counter document for store last sequence.首先,为存储最后一个序列创建计数器文档。 after it, apply pre save hook for update seq of tea
之后,应用预保存钩子更新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);
Please check on .findOneAndUpdate() , which helps you to achieve things in one DB call :请检查.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')}
});
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.