It is possible to use node.js packages within Meteor as described here, however as require
is not defined globally, packages having transitive dependencies (as for example xml2js or aws-lib) break with
ReferenceError: require is not defined
Any ideas on how to fix or work around this issue without altering the libraries?
I followed the instructions from your linked question. I used the node-xml2js library to test this with the test fixture from the code base and achieved it in the following way.
Meteor.startup(function () {
// This solves the issue
var require = __meteor_bootstrap__.require;
// The example from node-xml2js readme
var fs = require('fs'),
xml2js = require('xml2js');
var parser = new xml2js.Parser();
fs.readFile('/home/prashant/order.xml', 'utf8', function(err, data) {
parser.parseString(data, function (err, result) {
console.log(result);
console.log('Done');
});
});
});
I think the key was to define a variable require
and assign it to Meteor's require function. When Meteor loads the server assets, it also loads require
and solves the problem of the transitive dependency. I made no changes to the node-xml2js library.
Hope this helps!
In the latest version of Meteor (0.6.3, and presumably onwards), you need to use Npm.require()
instead of require()
by itself.