简体   繁体   English

Node JS 如何将值保存到 Mongo DB

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM