我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, (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");
});
使用try / catch或.then ---> .catch模式来处理此警告:https://til.hashrocket.com/posts/aucwkd8b36-asyncawait-unhandledpromiserejectionwarning
getNewSheet(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);
});
似乎您没有通过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();
});
}