我有一个用NodeJS编写的Azure函数应用程序,它生成一个Excel文件并将其作为附件发送。
我使用npm包ExcelJS创建NodeMailer文件,使用npm包NodeMailer作为附件发送该文件。
下面是我的Azure函数index.js:
import { AzureFunction, Context } from "@azure/functions";
import * as azdev from "azure-devops-node-api";
import * as witif from "azure-devops-node-api/interfaces/WorkItemTrackingInterfaces";
import * as witapi from "azure-devops-node-api/WorkItemTrackingApi"
const timerTrigger: AzureFunction = async function (context: Context, myTimer: any): Promise<void> {
let orgUrl = "https://dev.azure.com/{organization name}"
let token = process.env["DEVOPS_TOKEN"] // token gets inserted during runtime
let authHandler = azdev.getPersonalAccessTokenHandler(token);
let connection = new azdev.WebApi(orgUrl, authHandler);
const ExcelJS = require('exceljs');
const { DateTime } = require("luxon");
const nodemailer = require("nodemailer");
const queryId = "....8798987"; // work item query id from Azure Boards
const wit: witapi.IWorkItemTrackingApi = await connection.getWorkItemTrackingApi();
const result = await wit.queryById(queryId);
if (result == null)
{
throw new Error("Result was null.");
}
// generate Excel file
const workbook = new ExcelJS.Workbook();
workbook.creator = 'Me';
workbook.lastModifiedBy = 'Me';
workbook.created = new Date();
const sheet = workbook.addWorksheet('Query Results');
let colNames: string[] = [];
let colRefNames: string[] = [];
let queryItems = [];
let fields: string[] = []
for (let col of result.columns) {
colNames.push(col.name);
colRefNames.push(col.referenceName);
}
sheet.columns = colNames;
for (let item of result.workItems) {
queryItems.push(await wit.getWorkItem(item.id, colRefNames) )
}
for (let q of queryItems) {
for (let f of Object.keys(q.fields)) {
if (f == 'System.AssignedTo') {
sheet.addRow(q.fields[f].displayName)
} else {
sheet.addRow(q.fields[f])
}
}
}
const currentdate = DateTime.now().toFormat('MM-dd-yy');
context.log('creating Excel file');
workbook.xlsx.writeFile('./%TMP%/workitemquery_' + currentdate + '.xlsx').then(() => {
context.log('saved');
}).catch((err) => {
context.log('err', err);
})
// Send the email
const transporter = nodemailer.createTransport({
host: "{SMTP Server IP address}",
port: 50025,
secure: false,
});
const mailOptions = {
...
attachments: [
filename: 'workitemquery_' + currentdate + '.xlsx',
path: './%TMP%/workitemquery_' + currentdate + '.xlsx'
]
}
context.log('Sending email');
let info = await transporter.sendMail({mailOptions, function(error, info) {
if (error) {
context.log("sent mail error: " +error.message);
}
context.log(info.response);
}
});
};
export default timerTrigger;
当我运行函数应用程序时,它会在workbook.xlsx.writeFile函数期间失败,并给出以下错误:
err [Error: ENOENT: no such file or directory, open 'C:\home\site\wwwroot\%TMP%\workitemquery_11-20-22.xlsx'] {
errno: -4058,
code: 'ENOENT',
syscall: 'open',
path: 'C:\\home\\site\\wwwroot\\%TMP%\\workitemquery_11-20-22.xlsx'
}
我试图将文件保存到函数应用程序的临时文件夹中,这个文件夹是%TMP%,但是它保存在错误的位置。如何将Excel文件保存在正确的文件夹中,以便sendMail函数能够找到它?
发布于 2022-07-20 10:27:20
我知道问题出在哪里了。部分问题是Azure函数存储帐户中没有临时文件夹。我创建了这个文件夹路径C:\local\Temp
。第二部分是我必须使用Windows格式硬编码文件路径,如下所示:
await workbook.xlsx.writeFile('C:\\local\\Temp\\workitemquery_' + currentdate + '.xlsx')
attachments: [
{
filename: 'ukfastserverquery_' + currentdate + '.xlsx',
path: 'C:\\local\\Temp\\workitemquery_' + currentdate + '.xlsx'
}
]
https://stackoverflow.com/questions/73054575
复制