【问题标题】:unable to find records in mongobd after await model.save in nodejs/express.js application在节点 js/express.js 应用程序中等待 model.save 后无法在 mongodb 中找到记录
【发布时间】:2020-09-02 03:00:10
【问题描述】:

我有 2 个模型员工和任务列表。

var mongoose=require("mongoose");
var findOrCreate = require('mongoose-findorcreate');
var uniqueValidator = require('mongoose-unique-validator');

var employeeSchema = new mongoose.Schema({
    empId : { type : Number , unique : true, required : true },
    empName : { type : String , unique : true, required : true },
    empTeam : { type : String , required : true },
    created : {type : Date, default : Date.now}
  });

  employeeSchema.plugin(findOrCreate,uniqueValidator);
  module.exports = mongoose.model("Employee", employeeSchema);


// Mongoose Tasklist Model config

var mongoose=require("mongoose");
var findOrCreate = require('mongoose-findorcreate');
var uniqueValidator = require('mongoose-unique-validator');

var tasklistSchema = new mongoose.Schema({
    taskId : { type : Number , unique : true, required : true },
    taskDesc : { type : String , unique : true, required : true },
    taskDetails : {type : String},
    taskAssignee : [{
        type:mongoose.Schema.Types.ObjectId,
        ref:"Employee"
    }],
    startDate: Date,
    dueDate: Date,
    taskStatus: String,
    created : {type : Date, default : Date.now},

  });

  tasklistSchema.plugin(findOrCreate, uniqueValidator);  
  module.exports = mongoose.model("Tasklist", tasklistSchema);

我有一个编辑路线,我在其中为任务分配了多个受让人。

  router.post("/tasklist/:id/edit", function(req,res){
    Tasklist.findOneAndUpdate({_id:req.params.id},req.body.tasklist, async function(err, tasklist){
        if(err){
            req.flash("error", "Unable to update the tasklist record : "+err.message);
            res.redirect("/employee");
        } else {

            var emp_id=req.body.taskAssignee.split(',');

            try {
                emp_id.forEach(assignee => {
                    return new Promise (function(resolve, reject){
                        Employee.findById(assignee, function(err, employee){
                            if(err){
                                console.log("error in finding employee :"+assignee);
                                reject("There was an error loading the employee data in to the database : "+err.message);
                            } else {
                                tasklist.taskAssignee.push(employee);
                                console.log("employee saved");
                                resolve("Employee records uploaded successfully");
                            }
                        });
                    });                
                });
                console.log("Tasklist Saving....")
                let savetasklist= await tasklist.save();
                console.log("Tasklist Saved : ");
                req.flash("success", "Updated Tasklist"+req.body.tasklist);  
                res.redirect("/tasklist");
            } catch (err){
                req.flash("error", "Updating Tasklist"+err);  
                res.redirect("/tasklist");
            } 
        }
    });

 });

我可以将员工推送到 tasklist.taskAssignee 并执行 tasklist.save()。没有错误。但是,更新不会保留在 mongoDB 中。

控制台输出如下所示。

some more logging info.
connection successful
Tasklist Saving....
employee saved: Assignee:5ebebe1476911d570448ee44Employee:{
  _id: 5ebebe1476911d570448ee44,
  empId: 32141,
  empName: 'adsdasd',
  empTeam: 'C Team',
  created: 2020-05-15T16:06:44.342Z,
  __v: 0
}
record pushed
Tasklist Saved :
{
  taskAssignee: [
    {
      _id: 5ebebe1476911d570448ee44,
      empId: 32141,
      empName: 'adsdasd',
      empTeam: 'C Team',
      created: 2020-05-15T16:06:44.342Z,
      __v: 0
    }
  ],
  _id: 5ebf1c4830f79c178c7f9905,
  taskId: 17562,
  taskDesc: 'WTX subscription process',
  dueDate: 2020-05-25T18:30:00.000Z,
  created: 2020-05-15T22:48:40.091Z,
  __v: 0
} 

在这方面需要帮助。为什么任务列表没有与员工保持一致?

【问题讨论】:

  • 建议使用 findAndModify 或将 useFindAndModify 选项设置为 false
  • 将 useFindAndModify 选项设置为 false。还是同样的问题。
  • 为什么不按照建议尝试新的 api///。
  • 更多日志信息。
  • 请检查我的答案..

标签: javascript node.js express mongoose async-await


【解决方案1】:

我看 urcode,看来你不是在等待 promise 解决

const promises = emp_id.map((assignee) => {
  return new Promise(function (resolve, reject) {
    Employee.findById(assignee, function (err, employee) {
      if (err) {
        console.log("error in finding employee :" + assignee);
        reject(
          "There was an error loading the employee data in to the database : " +
            err.message
        );
      } else {
        tasklist.taskAssignee.push(employee);
        console.log("employee saved");
        resolve("Employee records uploaded successfully");
      }
    });
  });
});
await Promise.all(promises) // here wait..

整个例子。

router.post("/tasklist/:id/edit", function (req, res) {
  Tasklist.findOneAndUpdate(
    { _id: req.params.id },
    req.body.tasklist,
    async function (err, tasklist) {
      if (err) {
        req.flash(
          "error",
          "Unable to update the tasklist record : " + err.message
        );
        res.redirect("/employee");
      } else {
        var emp_id = req.body.taskAssignee.split(",");

        try {
          const promises = emp_id.map((assignee) => {
            return new Promise(function (resolve, reject) {
              Employee.findById(assignee, function (err, employee) {
                if (err) {
                  console.log("error in finding employee :" + assignee);
                  reject(
                    "There was an error loading the employee data in to the database : " +
                      err.message
                  );
                } else {
                  tasklist.taskAssignee.push(employee);
                  console.log("employee saved");
                  resolve("Employee records uploaded successfully");
                }
              });
            });
          });
          await Promise.all(promises)
          console.log("Tasklist Saving....");
          let savetasklist = await tasklist.save();
          console.log("Tasklist Saved : ");
          req.flash("success", "Updated Tasklist" + req.body.tasklist);
          res.redirect("/tasklist");
        } catch (err) {
          req.flash("error", "Updating Tasklist" + err);
          res.redirect("/tasklist");
        }
      }
    }
  );
});

【讨论】:

  • 它一直在等待......在员工保存后......不会移动到任务列表保存......
猜你喜欢
  • 2013-08-27
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-19
  • 2020-11-05
  • 2020-01-09
  • 2019-10-27
相关资源
最近更新 更多