Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在Azure函数应用程序临时文件夹中保存Excel文件时出错

在Azure函数应用程序临时文件夹中保存Excel文件时出错
EN

Stack Overflow用户
提问于 2022-07-20 07:44:12
回答 1查看 49关注 0票数 0

我有一个用NodeJS编写的Azure函数应用程序,它生成一个Excel文件并将其作为附件发送。

我使用npm包ExcelJS创建NodeMailer文件,使用npm包NodeMailer作为附件发送该文件。

下面是我的Azure函数index.js:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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函数期间失败,并给出以下错误:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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函数能够找到它?

EN

回答 1

Stack Overflow用户

发布于 2022-07-20 10:27:20

我知道问题出在哪里了。部分问题是Azure函数存储帐户中没有临时文件夹。我创建了这个文件夹路径C:\local\Temp。第二部分是我必须使用Windows格式硬编码文件路径,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
await workbook.xlsx.writeFile('C:\\local\\Temp\\workitemquery_' + currentdate + '.xlsx')

attachments: [
            {
                filename: 'ukfastserverquery_' + currentdate + '.xlsx',
                path: 'C:\\local\\Temp\\workitemquery_' + currentdate + '.xlsx'
            }
        ]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73054575

复制
相关文章
Java中的注解是如何工作的?
自Java5.0版本引入注解之后,它就成为了Java平台中非常重要的一部分。开发过程中,我们也时常在应用代码中会看到诸如@Override,@Deprecated这样的注解。这篇文章中,我将向大家讲述到底什么是注解,为什么要引入注解,注解是如何工作的,如何编写自定义的注解(通过例子),什么情况下可以使用注解以及最新注解和ADF(应用开发框架)。这会花点儿时间,所以为自己准备一杯咖啡,让我们来进入注解的世界吧。
哲洛不闹
2019/05/13
1.5K0
Java中的注解是如何工作的?
Java中的注解是如何工作的?
自Java5.0版本引入注解之后,它就成为了Java平台中非常重要的一部分。开发过程中,我们也时常在应用代码中会看到诸如@Override,@Deprecated这样的注解。这篇文章中,我将向大家讲述到底什么是注解,为什么要引入注解,注解是如何工作的,如何编写自定义的注解(通过例子),什么情况下可以使用注解以及最新注解和ADF(应用开发框架)。这会花点儿时间,所以为自己准备一杯咖啡,让我们来进入注解的世界吧。
java思维导图
2019/05/21
1.7K0
Java中的注解是如何工作的?
自Java5.0版本引入注解之后,它就成为了Java平台中非常重要的一部分。开发过程中,我们也时常在应用代码中会看到诸如@Override,@Deprecated这样的注解。这篇文章中,我将向大家讲述到底什么是注解,为什么要引入注解,注解是如何工作的,如何编写自定义的注解(通过例子),什么情况下可以使用注解以及最新注解和ADF(应用开发框架)。这会花点儿时间,所以为自己准备一杯咖啡,让我们来进入注解的世界吧。
JAVA葵花宝典
2019/05/24
1.7K0
Java 中的注解到底是如何工作的?
自Java5.0版本引入注解之后,它就成为了Java平台中非常重要的一部分。开发过程中,我们也时常在应用代码中会看到诸如@Override,@Deprecated这样的注解。
南风
2019/08/16
1.5K0
Java 中的注解到底是如何工作的?
Java中的注解到底是如何工作的?
自Java5.0版本引入注解之后,它就成为了Java平台中非常重要的一部分。开发过程中,我们也时常在应用代码中会看到诸如@Override,@Deprecated这样的注解。
Java技术栈
2019/06/19
2.1K0
Java中的注解到底是如何工作的?
Java 的 NIO 是如何工作的?
在这个数据爆炸的时代,有大量的数据在系统中流动,一个应用系统的瓶颈往往都是 IO 瓶颈。传统的 javaIO 模型是 BIO,也就是同步阻塞 IO,数据在写入 OutputStream 或者从 InputStream 读取时,如果没有数据没有读到或写完,线程都会被阻塞,处于等待状态,直到数据读取完成或写入完成。而在网络编程中,每一个客户端连接发出后,服务端都会有一个对应线程来处理请求,服务器线程与并发数成 1:1 关系,然而一个服务器所能处理的线程是有限的,处理高并发时就会有问题。
水货程序员
2018/11/13
1.6K0
Java I/O底层是如何工作的?
本博文主要讨论I/O在底层是如何工作的。本文服务的读者,迫切希望了解Java I/O操作是在机器层面如何进行映射,以及应用运行时硬件都做了什么。 假定你熟悉基本的I/O操作,比如通过Java I/O API读写文件。这些内容不在本文的讨论范围。 缓存处理和内核vs用户空间 缓冲与缓冲的处理方式,是所有I/O操作的基础。术语“输入、输出”只对数据移入和移出缓存有意义。任何时候都要把它记在心中。 通常,进程执行操作系统的I/O请求包括数据从缓冲区排出(写操作)和数据填充缓冲区(读操作)。这就是I/O的整体概念
用户1263954
2018/01/30
1.2K0
Java I/O底层是如何工作的?
Java I/O底层是如何工作的?
缓冲与缓冲的处理方式,是所有I/O操作的基础。术语“输入、输出”只对数据移入和移出缓存有意义。任何时候都要把它记在心中。通常,进程执行操作系统的I/O请求包括数据从缓冲区排出(写操作)和数据填充缓冲区(读操作)。这就是I/O的整体概念。在操作系统内部执行这些传输操作的机制可以非常复杂,但从概念上讲非常简单。我们将在文中用一小部分来讨论它。
哲洛不闹
2018/09/19
6580
Java I/O底层是如何工作的?
Java I/O底层是如何工作的?
本博文主要讨论I/O在底层是如何工作的。本文服务的读者,迫切希望了解Java I/O操作是在机器层面如何进行映射,以及应用运行时硬件都做了什么。假定你熟悉基本的I/O操作,比如通过Java I/O API读写文件。这些内容不在本文的讨论范围。
哲洛不闹
2018/09/19
8160
Java I/O底层是如何工作的?
灵魂拷问:Java 的 substring() 是如何工作的?
在逛 programcreek 的时候,我发现了一些小而精悍的主题。比如说:Java 的 substring() 方法是如何工作的?像这类灵魂拷问的主题,非常值得深入地研究一下。
沉默王二
2019/11/23
1.2K0
React中的浅比较是如何工作的?
浅比较这个概念在React开发过程中很常见。它在不同的过程中扮演着关键的角色,也可以在React组件生命周期的几个地方找到。判断class组件是否应该更新、React hood的依赖数组、通React.memo 缓存处理等例子
ACK
2022/05/06
3K0
Keras中的Embedding层是如何工作的
在学习的过程中遇到了这个问题,同时也看到了SO中有相同的问题。而keras-github中这个问题也挺有意思的,记录一下。
千灵域
2022/06/17
1.4K0
「译文」Prometheus 中的 relabel 是如何工作的?
Relabel(重新标记)是一个强大的工具,允许你通过重写标签集对 Prometheus 目标 (targets) 和指标 (Metrics) 进行分类和过滤。
东风微鸣
2022/12/01
6.6K0
Java | Spring Cloud Gateway 是如何工作的
负责转发请求的 NettyRoutingFilter负责将响应回写到原连接的 NettyWriteResponseFilter如何实现负载均衡的总结参考扩展阅读鸣谢
双鬼带单
2021/03/19
2.5K0
Java | Spring Cloud Gateway 是如何工作的
Python中的元编程
就像元数据是关于数据的数据一样,元编程是编写程序来操作程序(Just like metadata is data about data, metaprogramming is writing programs that manipulate programs)。一个常见的看法是元编程是用来成成其他程序的程序,但是实际上它的含义更为广泛(It's a common perception that metaprograms are the programs that generate other programs. But the paradigm is even broader)。所有用于读取、分析、转换或修改自身的程序都是元编程的例子。比如:
py3study
2020/01/09
5590
Node.js 中的 require 是如何工作的?
作为前端开发者,不可避免每天都要跟 Node.js 打交道。Node 遵循 Commonjs 规范,规范的核心是通过 require 来加载依赖的其他模块。我们已经常习惯于使用社区提供的各种库,但对于模块引用的背后原理知之甚少。这篇文章通过源码阅读,浅析在 commonjs 规范中 require 背后的工作原理。
coder_koala
2020/09/10
3.4K0
Java中的Lambda是如何实现的
在上面的字节码中,我们可以看到一个名为 lambdamain0 的方法,该方法是在编译阶段自动生成的,其对应于示例源码中的lambda方法体。
KINGYT
2023/03/15
1.1K0
Java中的Lambda是如何实现的
JavaScript是如何工作的?
当将 JavaScript 文件加载到浏览器中时,JavaScript Engine 会从上到下逐行执行该文件(异步代码将是一个例外,我们将在本系列后面的内容中看到异步代码)。
小丑同学
2020/10/30
2.8K0
JavaScript是如何工作的?
Widget是如何工作的
在前面我们介绍各种各样的Widget,相信大家对Wiget的使用都已经有了自己的认识,今天我们就从底层角度看下Widget是如何工作,是什么支撑起了Wiget这个系统。
flyou
2020/05/28
3.3K0
Goroutine是如何工作的
一、Go语言简介 如果你是Go语言新手,或如果你对"并发(Concurrency)不是并行(parallelism)"这句话毫无赶脚,那么请看一下Rob Pike大神关于这个主题的演讲吧,演讲共30分 钟,我敢保证你在这个演讲上花费30分钟是绝对值得的。 总结一下两者(Concurrency和Parallelism)的不同:"当人们听到并发(Concurrency)这个词时,总是会想起并行 (Parallelism),它们之间有相关性,但却是两个明显不同的概念。在编程领域,并发(Concurrency)是独
李海彬
2018/03/21
2.2K0

相似问题

如何访问特定的resw资源文件

31

UWP设计时的资源字符串(.resw)

12

从RESW资源获取文件

13

UWP中的资源文件(.resw)

13

UWP -动态加载resw资源文件

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文