Node.js Promise属性未定义

我2月份正在开发一个应用程序,但此后没有太多时间来从事该项目。在中断之前,所有程序都运行良好,但是我试图使该代码段再次运行而没有错误,以便我可以从上次中断的地方继续工作,而无需花费3天的时间再次对该错误进行故障排除。

我正在抓取一个Google驱动器文档,将其在本地进行管道编辑,然后保存在子文件夹中。最后,它还会发送一些邮件。

在80:25线上,我得到:

  

UnhandledPromiseRejectionWarning:TypeError:无法读取属性   未定义的“数据”

又不知道为什么,请新鲜的眼睛将我指向正确的方向吗?是范围错误吗?当然,我还重新创建了token.json。

let getNewSheet = function() {
  return new Promise(function(resolve,reject) {

    //////// START DRIVE DOWNLOAD SHEET ////////////////       
    const fs = require("fs");
    const readline = require("readline");
    const {
      google
    } = require("googleapis");

    const SCOPES = "https://www.googleapis.com/auth/drive";
    const TOKEN_PATH = "token.json";

    fs.readFile("credentials.json",(err,content) => {
      if (err) return console.log("Error loading client secret file:",err);
      authorize(JSON.parse(content),getLatestListFromDrive);
    });

    function authorize(credentials,callback) {
      const {
        client_secret,client_id,redirect_uris
      } = credentials.installed;
      const oAuth2Client = new google.auth.OAuth2(
        client_id,client_secret,redirect_uris[0]
      );

      // Check if we have previously stored a token.
      fs.readFile(TOKEN_PATH,token) => {
        if (err) return getaccessToken(oAuth2Client,callback);
        oAuth2Client.setCredentials(JSON.parse(token));
        callback(oAuth2Client);
      });
    }

    function getaccessToken(oAuth2Client,callback) {
      const authUrl = oAuth2Client.generateAuthUrl({
        access_type: "offline",scope: SCOPES
      });
      console.log("Authorize this app by visiting this url:",authUrl);
      const rl = readline.createInterface({
        input: process.stdin,output: process.stdout
      });
      rl.question("Enter the code from that page here: ",code => {
        rl.close();
        oAuth2Client.getToken(code,token) => {
          if (err) return console.error("Error retrieving access token",err);
          oAuth2Client.setCredentials(token);
          // Store the token to disk for later program executions
          fs.writeFile(TOKEN_PATH,JSON.stringify(token),err => {
            if (err) console.error(err);
            console.log("Token stored to",TOKEN_PATH);
          });
          callback(oAuth2Client);
        });
      });
    }

    function getLatestListFromDrive(auth) {
      const drive = google.drive({
        version: "v3",auth
      });
      var fileId = process.env.NODE_DRIVE_FILE_ID;
      var dest = fs.createWriteStream("" + appDir + "\\tmp\\feedbacklist.xlsx");

      drive.files.export({
          fileId: fileId,mimeType: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
        },{
          responseType: "stream"
        },function(err,res) {
          res.data
            .on("end",() => {
              //  console.log("Done fetching latest Drive sheet..");
              resolve();
            })
            .on("error",err => {
              console.log("Error",err);
            })
            .pipe(dest);
        }
      );
    }
  });
};

var path = require("path");
var appDir = path.dirname(require.main.filename);

let sendMails = function() {
  return new Promise(function(resolve,reject) {

    ///////////////////////// START XLXS AND MAILER STUFF //////////////////

    const XLSX = require("xlsx");
    const workbook = XLSX.readFile("" + appDir + "\\tmp\\feedbacklist.xlsx",{
      type: "binary",cellDates: true,dateNF: "yyyy-mm-dd;@",sheetStubs: true
    });
    const SheetNameList = workbook.SheetNames;
    var rows = XLSX.utils.sheet_to_json(workbook.Sheets[SheetNameList[0]],{
      raw: false,//  header:1
      defval: '0'
    });
    var raw = workbook.Sheets[SheetNameList[0] /*,{header:1} */ ];
    //rows.tourDate = rows.tourDate;
    var today = new Date();
    today = today.toISOString().slice(0,10);

    var dateYesterday = new Date();
    dateYesterday.setDate(dateYesterday.getDate() - 1);
    dateYesterday = dateYesterday.toISOString().slice(0,10);

    var dayYesterday = new Date();
    var days = [
      "Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"
    ];
    dayYesterday.setDate(dayYesterday.getDate() - 1);
    dayYesterday = days[dayYesterday.getDay()];

    var dateTomorrow = new Date();
    dateTomorrow.setDate(dateTomorrow.getDate() + 1);
    dateTomorrow = dateTomorrow.toISOString().slice(0,10);

    var dayTomorrow = new Date();
    var futureDays = [
      "Sunday","Saturday"
    ];
    dayTomorrow.setDate(dayTomorrow.getDate() + 1);
    dayTomorrow = futureDays[dayTomorrow.getDay()];

    //setInterval(function () {
    var filteredRows = rows.filter(eachRow);

    function eachRow(eachRow) {
      return eachRow["tourDate"] === dateYesterday && eachRow["feedbacksent"] === '0' /* || eachRow["feedbacksent"] === 'undefinded' */ ; //2019-02-17
    }

    if (filteredRows != 0) {
      for (x = 0; x < filteredRows.length; x++) {



        console.log(filteredRows[x].emailaddress);
        console.log(filteredRows[x].fName);
        console.log(filteredRows[x].tourDate /* .toISOString().slice(0,10) */ );
        console.log("Feedback: " + filteredRows[x].feedbacksent);

        ///////////////////////////////////
        var index = rows.indexOf(filteredRows[x]);
        console.log("Index: " + index);

        const updateFeedbackCell = raw[XLSX.utils.encode_cell({
          r: index + 1,// +1 to adjust for header row
          c: 13
        })];

        // filteredRows[x].feedbacksent = '1'; changes var only
        updateFeedbackCell.v = '1';
        XLSX.writeFile(workbook,"" + appDir + "\\tmp\\feedbacklist.xlsx");
        console.log(filteredRows[x]);
        ////////////////////////////////////


        //// INSERT MAILER snIPPET HERE ////
        var nodemailer = require("nodemailer");
        //var config = require('./config/passW'); //turn PW back on !!
        var wtctLink = "linktest";
        var gReviewLink =
          "testlink";

        var transporter = nodemailer.createTransport({
          host: process.env.NODEMAILER_SERVICE,// port: 587,secure: false,// upgrade later with STARTTLS
          auth: {
            user: process.env.NODEMAILER_USER,pass: process.env.NODEMAILER_PASS
          }
        });
        var mailOptions = {
          from: process.env.NODEMAILER_FROM,to: "" + filteredRows[x].emailaddress + "",subject: "Hi " +
            filteredRows[x].fName + ",how was " + dayYesterday + "'s tour?",html: "<p>Hi " + filteredRows[x].fName + ",</p> <p>Thanks again for us!",text: "Hi " + filteredRows[x].fName + "Thanks again for using us!"
        };

        transporter.sendMail(mailOptions,function(error,info) {
          //check for console errors
          if (error) {
            console.log(error);
          } else {
            console.log("Sent status: " + info.response);
            resolve();
          }
        });
        ////// END MAILER HERE
      }
    } else {
      console.log("No rows/records to process for yesterday..");
    }
    //},10000); //86,400,000 for 24 hours
    //////// END XLSX and MAILER STUFF ////////////////
  });
};

getNewSheet(console.log("fetching latest drive sheet.."))
  .then(function(result) {
    console.log("sending mails..");
    return sendMails(result);

  }).then(function() {
    console.log("feedback mails sent");
  });
zuotiandewo 回答:Node.js Promise属性未定义

使用try / catch或.then ---> .catch模式来处理此警告: https://til.hashrocket.com/posts/aucwkd8b36-asyncawait-unhandledpromiserejectionwarning

select top (2) ScheduleYear 
from t_year 
where 
     ScheduleYear <= year(getutcdate()) 
    and enabled = 1
order by ScheduleYear DESC
,

看来您在resolve()中没有传递任何东西

示例

function myAsyncFunction(url) {
  return new Promise((resolve,reject) => {
    const xhr = new XMLHttpRequest();
    xhr.open("GET",url);
    xhr.onload = () => resolve(xhr.responseText);
    xhr.onerror = () => reject(xhr.statusText);
    xhr.send();
  });
}
,

太愚蠢了,我没有给我的ENV变量打电话。将require('dotenv').config({path: __dirname + '/.env'})设置在页面顶部,即可使用。

本文链接:https://www.f2er.com/3161262.html

大家都在问