如何在JavaScript Azure Functions中共享代码?

9

如何在Azure函数应用程序的文件之间共享代码(例如Mongo模式定义)?

我需要这样做,因为我的函数需要访问共享的Mongo模式和模型,例如以下基本示例:

var blogPostSchema = new mongoose.Schema({
  id: 'number',
  title: 'string',
  date: 'date',
  content: 'string'
});

var BlogPost = mongoose.model('BlogPost', blogPostSchema);

我曾试图在我的host.json文件中添加一行 "watchDirectories": [ "Shared" ],并在该文件夹中添加了一个index.js文件,其中包含上述变量定义,但是其他函数似乎无法使用它。
我得到了一个异常:Exception while executing function: Functions.GetBlogPosts. mscorlib: ReferenceError: BlogPost is not defined。
我还尝试了明确地需要.js文件,但好像找不到。可能是我路径写错了。
有没有人有关于如何在Azure函数之间共享.js代码的示例或提示?

错误似乎出现在其他地方,因为BlogPost很可能实际上是指向“模型”而不是“模式”定义的符号。此外,我怀疑您无法以那种方式在Azure函数中使用mongoose,因为我“假定”支持的功能仅限于“模式”本身。请参见Mongoose in the browser - Neil Lunn
嗨Neil,你说得对,BlogPost var是对模型的引用。然而,如果我将模式和模型放在一个Azure函数中,它们可以按照我的预期工作,但是如果我将模式和模型添加到第二个函数中,mongoose会出现错误“Cannot overwrite 'BlogPost' model once compiled”,所以我正在尝试找到一种方法,可以定义模式和模型一次并重复使用它。 - dougajmcdonald
这基本上是我的想法。我个人还没有足够地玩过 Azure 函数,所以仍然在待办列表上。除非它们实际上可以启动一个完整的节点实例并持久化(我认为这不是重点),否则我不认为这样的东西会起作用。没有看到整个上下文很难说。 - Neil Lunn
以下是修复的结果,只需进行一些微小的调整即可解决问题。 - dougajmcdonald
1个回答

18

我通过以下步骤解决了这个问题:

  1. 在根目录的 hosts.json 中添加一行以便于 watch 共享文件夹。 "watchDirectories": [ "Shared" ]
  2. 在共享文件夹中,添加一个包含以下模式/模型定义和导出的 blogPostModel.js 文件。

shared\blogPostModel.js

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var blogPostSchema = new Schema({
    id: 'number',
    title: 'string',
    date: 'date',
    content: 'string'
});
module.exports = mongoose.model('BlogPost', blogPostSchema);
  1. 在我的函数require中,使用以下路径共享文件: var blogPostModel = require('../Shared/blogPostModel.js');

然后我可以连接并与模型交互,在每个单独的函数中执行find等操作。

这个解决方案是从以下SO帖子中组合而成的:

Azure Function in Node.js and shared files

Cannot overwrite model once compiled Mongoose


1
谢谢!如果您添加“watchDirectories”:[“shared”]并创建一个名为“shared”的目录,Azure函数将识别它。 - Álvaro Agüero

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接