【问题标题】:I am using async-waterfall and facing some issues我正在使用 async-waterfall 并面临一些问题
【发布时间】:2019-07-07 17:32:48
【问题描述】:

我只是想从名为“slt_timesheet”的文档中获取详细信息。我正在使用 async-waterfall 依次运行 2-3 个函数。

如果我使用 'get' 方法获取 slt_timesheet 的详细信息,那么我将获得有关我的 slt-timesheet 的所有详细信息,但如果我使用 async-waterfall,我将无法从文档中获取详细信息。

    const express = require('express');
    const app=express();

    const async=require("async");
    const waterfall=require('async-waterfall');

    const TIMESHEET_DETAILS = require('../Models/slt_timesheet');

    //For filing the timesheet
          router.post('/postTimesheet',(req,res)=>{
            let monthFromClient=req.body.month;
            let projectArrayFromClient=req.body.projectArray;
            let activityArray=req.body.activityArray;
            let hoursArrayForAMonth=req.body.hoursArray;

            let currentDateObject = new Date();
            let lastMonthDateObject= new Date(currentDateObject.getFullYear(),currentDateObject.getMonth()+1,0);
            let nowMonth = monthList[lastMonthDateObject.getMonth()];
            let thisYear = lastMonthDateObject.getFullYear();
            let response;
            let onlyTimeSheetData=[];
            let timesheetRecord;

            try {
               //First check here request month is same as the current method
              if(monthFromClient===nowMonth && req.session.email!=null){
           //async waterfall starts here 
                waterfall([
                    function getTimesheet(callback){
                      console.log('waterfall execution starts here');

                      try {
                        timesheetRecord = TIMESHEET_DETAILS.findOne({email:req.session.email});
                        console.log(timesheetRecord.email);
                        // onlyTimeSheetData=timesheetRecord.timesheetData[0];
                      } catch (e) {
                        console.log(e);
                        callback(e,null);
                        return;
                      }

                      console.log(onlyTimeSheetData);
                      callback(null,onlyTimeSheetData);
                    },

                    function insertNewDataInFormat(err,onlyTimeSheetData) {
                      if(err){
                        console.error(err);
                      }else {
                        console.log(onlyTimeSheetData);
                      }

                    }
                ]);
                response='successful';
              }else {
                response='not successful';
              }
            } catch (e) {
              console.error('error find in main catch'+e);
            } finally {
              res.send(response);
            }

【问题讨论】:

    标签: node.js express mongoose


    【解决方案1】:

    findOne 方法是一个异步调用,您在没有回调的情况下调用它。尝试使用回调或承诺调用findOne

    【讨论】:

    • 你能和我分享一下如何使用 findOne 方法回调的代码吗?并感谢您的回复!
    • 尝试使用以下代码更改您的 'getTimesheet' 函数:function getTimesheet(callback) { console.log('waterfall execution starts here'); TIMESHEET_DETAILS.findOne({ email: req.session.email }, function (err, timesheetRecord) { if(err) callback(e); else callback(null, onlyTimeSheetData); }); } 如果这不起作用,我们可以将其更改为 promises 或 async/await :)
    • 我试过这样,它根据你的解决方案使用回调函数! timesheetRecord=TIMESHEET_DETAILS.findOne({email:req.session.email}).exec((err,data)=>{ if(err){ console.error(err); } else{ callback(null,data.timesheetData[ 0]); } });而且您的解决方案也有效!太感谢了 !! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-03
    • 1970-01-01
    • 2021-08-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多