Nodejs MongoDB查询无法正常工作

时间:2019-02-09 08:34:59

标签: node.js mongodb mongoose

有人可以解释为什么我的简单更新/设置查询不起作用吗?我通过使用承诺的猫鼬通过nodejs进行查询。这是我的架构: const mongoose = require('mongoose');

var usersSchema = mongoose.Schema ({
    username:String,
    password:String,
    home_planet:Number,
    last_planet:Number,
    experience:Number,
    money:Number
}, {collection: 'account', versionKey: false});

module.exports = usersSchema;

这是我的数据库中更新/设置值的功能

    const usersSchema = require('./userSchema');
    const mongoose = require('mongoose');
    var userModel = mongoose.model('userModel', usersSchema);

userModel.setUserGold = setUserGold;

        function setUserGold(username, newGold) {
            return userModel.updateOne({username:username}, {
                $set: {experience:newGold}
            });
        }

以及对该函数的调用

userModel.setUserGold('test', 500);

在哪里测试用户名,500是该用户名要添加到数据库中的金值,但是没有设置/更新任何内容?

2 个答案:

答案 0 :(得分:0)

我设法通过在调用函数中添加.then()来解决此问题,例如:

userModel.setUserGold('test', 500)
.then((res) => {
   if (!res) return;
   console.log('player updated');
});

我不确定为什么没有.then()时为什么我不工作,而没有添加.then()之前我尝试了相同的功能,但它工作得还不错,但是一会儿它停止工作,直到我添加.then ()如果有人可以解释这将意味着很多。

答案 1 :(得分:0)

第一个版本中的问题是,如果updateOne函数未提供回调,则您不提供回调或处理返回的Promise。从@ types / mongoose看到这里的定义:

function trigData() { var table = document.getElementById('container-2'); var i; for (var i = 0; i < 2; i++){ var tr = document.createElement('tr'); var td1 = document.createElement('td'); var td2 = document.createElement('td'); td1.setAttribute("id", "equipment"); td2.setAttribute("id", "quantity"); } var text1 = document.getElementById("equipment").innerHTML = td1.value; var text1 = document.getElementById("equipment").innerHTML = td1.value; // ALSO TRIED THIS //var text1 = document.createTextNode(td1); //var text2 = document.createTextNode(td2); td1.appendChild(text1); td2.appendChild(text2); tr.appendChild(td1); tr.appendChild(td2); table.appendChild(tr); } /////////////// BELOW IS THE WHOLE CODE //////////////// <html> <head> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.0/css/bootstrap.min.css"> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.0/js/bootstrap.min.js"> </script> <style> .container-2 { position: absolute; top: 10%; left: 5%; width: 45%; height: 30%; margin-top: 15px; border: 3px solid #d9d9d9; background-color: #f2f2f2; overflow-x: scroll; overflow-y: scroll; } .container-2 table, th, td { width: 32.5%; height: 10px; border: 1px solid #d9d9d9; border-collapse: collapse; font-size: 15px; } th, td { padding: 0; } </style> </head> <body> <div class="borrow-list-area"> <table class="container-2" id="container-2"> <thead> <tr> <style>th,td{text-align:center;} </style> <th>Equipment</th> <th>Quantity</th> </tr> </thead> <script> // THIS IS CODE I'M HAVING TROUBLE WITH function trigData() { var table = document.getElementById('container- 2'); var i; for (var i = 0; i < 2; i++){ var tr = document.createElement('tr'); var td1 = document.createElement('td'); var td2 = document.createElement('td'); td1.setAttribute("id", "equipment"); td2.setAttribute("id", "quantity"); } var text1 = document.getElementById("equipment").innerHTML = td1; var text2 = document.getElementById("quantity").innerHTML = td1; td1.appendChild(text1); td2.appendChild(text2); tr.appendChild(td1); tr.appendChild(td2); table.appendChild(tr); } </script> <tbody></tbody> </table> </div> <div class="container" > <!-- Trigger the modal with a button --> <button type="button" class="button-1 btn-lg" data-toggle="modal" data-target="#myModal" style="width: 26%; margin:0; height: 40px; font-size: 100%;">Choose Equipment</button> <!-- Modal --> <div class="modal fade" id="myModal" role="dialog"> <div class="modal-dialog"> <!-- Modal content--> <div class="modal-content"> <div class="modal-header"> <p>Choose An Equipment Below</p> <button type="button" class="close" data-dismiss="modal">&times;</button> </div> <div class="modal-body"> <p>Available Equipments</p> <div class="form-inline"> <select name="dpdwn" class="drop-down"> <option selected="" disabled="">Select Equipment</option> <option id="a" value="dpdwn-1"></option> <option id="b" value="dpdwn-2"></option> <option id="c" value="dpdwn-3"></option> </select> <br><br> <input type="text" id="qnty-1" class="form-control" placeholder="Quantity" name="quantity" style="width:24%;"><br/> <script> var myObj, myJSON, text, obj; /////////////////////////////// DISPLAY /////////////////////////////////// // Storing data: myObj = { "cars" : [ "HONDA", "FIAT", "BMW" ] }; myJSON = JSON.stringify(myObj); localStorage.setItem("drop-down", myJSON); // Retrieving data: text = localStorage.getItem("drop-down"); obj = JSON.parse(text); document.getElementById("a").innerHTML = obj.cars[0]; //document.getElementById("a").value = obj.id; document.getElementById("b").innerHTML = obj.cars[1]; document.getElementById("c").innerHTML = obj.cars[2]; /////////////////////////////////// PASSING VALUES ////////////////////////////////////// function passValue1(a) { text = localStorage.getItem("drop-down"); obj = JSON.parse(text); var q = "dpdwn-1"; var b = "dpdwn-2"; var c = "dpdwn-3"; var e = document.getElementById(a); alert(a.value); if(a.value == q){ document.getElementById("equipment").innerHTML = obj.cars[0]; } else if(a.value == b){ document.getElementById("equipment").innerHTML = obj.cars[1]; } else { document.getElementById("equipment").innerHTML = obj.cars[2]; } } function passValue2(b) { document.getElementById("quantity").innerHTML = document.getElementById("qnty-1").value; } </script> <br/><br/> </div> </div> <div class="modal-footer"> <input class="submit-3" type = "submit" value = "Submit" name= "submit-2" onclick="trigData(); passValue1(dpdwn); passValue2(document.getElementById('qnty-1').value)"data-dismiss="modal" /> <button type="button" class="btn btn-default" data-dismiss="modal">Close</button> </div> </div> </div> </div> </div>

要解决您的问题,请为updateOne函数提供回调或像处理第二个版本一样处理Promise。