Node.js Node JS如何将值保存到Mongo DB

Node.js Node JS如何将值保存到Mongo DB,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我试图开发一个简单的网络应用程序,其中一个用户可以点茶,管理员用户可以看到这个订单。您能帮我解决我的问题吗: 我可以将tea添加到DB中,但它会消失,并且再次从0开始计数。我正在尝试只为DB中的一个用户做这件事。 非常感谢你的帮助 这是我的: app.js: 以下是我的用户模式: var mongoose = require("mongoose"); var passportLocalMongoose = require("passport-local-mongoose"); var User

我试图开发一个简单的网络应用程序,其中一个用户可以点茶,管理员用户可以看到这个订单。您能帮我解决我的问题吗: 我可以将tea添加到DB中,但它会消失,并且再次从0开始计数。我正在尝试只为DB中的一个用户做这件事。 非常感谢你的帮助

这是我的: app.js:

以下是我的用户模式:

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>
点击2次“添加茶”后在终端中输出:

再次单击

{ 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 }

您只是更新文档,而不是将其保存到数据库中
find
命令从数据库中获取文档,所以更新后需要调用
.save()

只需添加下面的行

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!');
        }
    });
});

}))

首先,为存储上次序列创建计数器文档。之后,为
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);
请检查,这有助于您在一次DB调用中实现目标:

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')}
    });
});

您只需更新文档一次,但不将其保存到数据库
find
命令刚从数据库中提取文档。@AlexeyN:它是否工作正常或仍然存在问题?@srinivasy试图实现您的解决方案,将返回消息。感谢添加此行没有帮助,因为存在TypeError:User.save不是函数。不知道为什么,因为我有我的用户模式
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!');
        }
    });
});
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);
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')}
    });
});