Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.js承诺属性未定义_Javascript_Node.js_Google Drive Api_Xlsx - Fatal编程技术网

Javascript Node.js承诺属性未定义

Javascript Node.js承诺属性未定义,javascript,node.js,google-drive-api,xlsx,Javascript,Node.js,Google Drive Api,Xlsx,我在2月份开发了一个应用程序,但从那以后就没有多少时间来做这个项目了。在我休息之前,一切都很好,但是我正在尝试让这个代码段再次运行,而不会出现错误,这样我就可以在不花3天时间再次排除错误的情况下重新开始 我正在抓取一个google drive文档,在本地编辑它,然后将它保存在一个子文件夹中。最后它还会发送一些邮件 在线80:25,我得到: 未处理的PromisejectionWarning:TypeError:无法读取属性 未定义的“数据” 我也不知道为什么,请给我一些新鲜的眼睛,告诉我正确的方

我在2月份开发了一个应用程序,但从那以后就没有多少时间来做这个项目了。在我休息之前,一切都很好,但是我正在尝试让这个代码段再次运行,而不会出现错误,这样我就可以在不花3天时间再次排除错误的情况下重新开始

我正在抓取一个google drive文档,在本地编辑它,然后将它保存在一个子文件夹中。最后它还会发送一些邮件

在线80:25,我得到:

未处理的PromisejectionWarning: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, (err, 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, (err, 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", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "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");
  });
let getNewSheet=function(){
返回新承诺(功能(解决、拒绝){
////////启动驱动器下载表////
常数fs=要求(“fs”);
const readline=require(“readline”);
常数{
谷歌
}=要求(“googleapis”);
常量范围=”https://www.googleapis.com/auth/drive";
const TOKEN_PATH=“TOKEN.json”;
fs.readFile(“credentials.json”,(err,content)=>{
if(err)返回console.log(“加载客户端机密文件时出错:”,err);
authorize(JSON.parse(content),getLatestListFromDrive);
});
函数授权(凭据、回调){
常数{
客户的秘密,
客户id,
重定向URI
}=已安装的凭据;
const oAuth2Client=new google.auth.OAuth2(
客户id,
客户的秘密,
重定向URI[0]
);
//检查我们以前是否存储过令牌。
fs.readFile(令牌路径,(错误,令牌)=>{
if(err)返回getAccessToken(oAuth2Client,回调);
oAuth2Client.setCredentials(JSON.parse(token));
回调(oAuth2Client);
});
}
函数getAccessToken(oAuth2Client,回调){
const authUrl=oAuth2Client.generateAuthUrl({
访问类型:“脱机”,
范围:范围
});
log(“通过访问此url授权此应用:”,authUrl);
const rl=readline.createInterface({
输入:process.stdin,
输出:process.stdout
});
rl.question(“在此处输入该页面的代码:”,代码=>{
rl.close();
oAuth2Client.getToken(代码,(错误,标记)=>{
if(err)返回console.error(“检索访问令牌时出错”,err);
oAuth2Client.setCredentials(令牌);
//将令牌存储到磁盘,以便以后执行程序
writeFile(TOKEN_PATH,JSON.stringify(TOKEN),err=>{
if(err)控制台错误(err);
日志(“令牌存储到”,令牌路径);
});
回调(oAuth2Client);
});
});
}
函数getLatestListFromDrive(auth){
const drive=google.drive({
版本:“v3”,
认证
});
var fileId=process.env.NODE\u DRIVE\u FILE\u ID;
var dest=fs.createWriteStream(“+appDir+”\\tmp\\feedbacklist.xlsx”);
drive.files.export({
fileId:fileId,
mimeType:“application/vnd.openxmlformats officedocument.spreadsheetml.sheet”
}, {
响应类型:“流”
},
函数(err、res){
资源数据
.on(“结束”,()=>{
//console.log(“完成获取最新的驱动器表…”);
解决();
})
.on(“错误”,err=>{
日志(“错误”,err);
})
.管道(目的地);
}
);
}
});
};
var路径=要求(“路径”);
var appDir=path.dirname(require.main.filename);
设sendMails=function(){
返回新承诺(功能(解决、拒绝){
/////////////////////////启动XLX和邮件程序//////////////////
常量XLSX=要求(“XLSX”);
常量工作簿=XLSX.readFile(“+appDir+”\\tmp\\feedbacklist.XLSX”{
键入:“二进制”,
cellDates:是的,
dateNF:“yyyy-mm-dd;@”,
存根:对
});
const SheetNameList=workbook.SheetNames;
var rows=XLSX.utils.sheet_to_json(workbook.Sheets[SheetNameList[0]]{
生:错,
//标题:1
定义:“0”
});
var raw=workbook.Sheets[SheetNameList[0]/*,{header:1}*/];
//rows.tourDate=rows.tourDate;
var today=新日期();
today=today.toISOString().slice(0,10);
var datedateforday=新日期();
dateDateDayed.setDate(dateDayed.getDate()-1);
DateThreed=DateThreed.toISOString().slice(0,10);
var daydeaday=新日期();
var天数=[
“星期日”、“星期一”、“星期二”、“星期三”、“星期四”、“星期五”、“星期六”
];
daydeayed.setDate(daydeayed.getDate()-1);
daydeaday=days[daydeaday.getDay()];
var datetomory=新日期();
datetomory.setDate(datetomory.getDate()+1);
datetomory=datetomory.toISOString().slice(0,10);
var daydomother=新日期();
var未来天数=[
“星期日”、“星期一”、“星期二”、“星期三”、“星期四”、“星期五”、“星期六”
];
daydroother.setDate(daydroother.getDate()+1);
Day明天=未来天[Day明天.getDay()];
//setInterval(函数(){
var filteredRows=rows.filter(每行);
函数eachRow(eachRow){
返回每个箭头[“tourDate”]==DateDateDate昨天和每个箭头[“feedbacksent”]=='0'/*| | |每个箭头[“feedbacksent”]==='Undefined'*/;//2019-02-17
}
if(filteredRows!=0){
对于(x=0;xgetNewSheet(console.log("fetching latest drive sheet.."))
  .then(function(result) {
    console.log("sending mails..");
    return sendMails(result);

  }).then(function() {
    console.log("feedback mails sent");
  }).catch(function(err) { // handle unhand led promise warning
    console.log(err);
  });
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();
  });
}