9

How can I share code (e.g. Mongo schema definitions) between files in an Azure function app?

I need to do this, as my functions require access to a shared mongo schema and models, such as this basic example:

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

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

I've tried to add a "watchDirectories": [ "Shared" ] line to my host.json and in that folder added an index.js containing the above variable definition but this doesn't seem to be available to the other functions.

I simply get a Exception while executing function: Functions.GetBlogPosts. mscorlib: ReferenceError: BlogPost is not defined.

I've also tried explitely requireing the .js file, but this seems not to be found. It could be I just got the path wrong.

Does anyone have an example or tips on how to share .js code between azure functions?

Gary Liu
  • 13,758
  • 1
  • 17
  • 32
dougajmcdonald
  • 19,231
  • 12
  • 56
  • 89
  • The error would appear to be elsewhere since it's likely that `BlogPost` is actually a symbol pointing to the "Model" rather than the "Schema" definition. Also I doubt you can use mongoose in that way with Azure functions, since I'm "presuming" the supported functionality would be limited to just the "Schema" itself. See [Mongoose in the browser](http://mongoosejs.com/docs/browser.html). – Neil Lunn Jun 18 '17 at 07:22
  • Hi Neil, you're right the BlogPost var is a reference to the model. However, if I put the schema and model in a single Azure function things work how I'm expecting, but if I then add the schema and model to a second function I get an error from mongoose `Cannot overwrite 'BlogPost' model once compiled` so I'm try to find a way I can define the schema and model once and re-use it – dougajmcdonald Jun 18 '17 at 07:28
  • That is basically my thinking. Have not personally played around enough with Azure functions to be certain, so still on the tuit list. Unless they can actually spin up a full node instance and persist ( which I don't think is the point ) then I don't see such a thing working. Hard to tell without seeing the whole context. – Neil Lunn Jun 18 '17 at 07:31
  • See below, managed to fix it with some minor tweaking – dougajmcdonald Jun 18 '17 at 07:41

1 Answers1

18

I fixed this issue by doing the following steps:

  1. Add a line to the root hosts.json to watch a shared folder. "watchDirectories": [ "Shared" ]
  2. In the shared folder, added a blogPostModel.js file containing the following schema/model definition and export

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. In my function require the shared file with the following path: var blogPostModel = require('../Shared/blogPostModel.js');

I can then make a connection and interact with the model doing finds etc in each individual function.

This solution was composed from the following SO posts:

Azure Function in Node.js and shared files

Cannot overwrite model once compiled Mongoose

dougajmcdonald
  • 19,231
  • 12
  • 56
  • 89