Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Exporting classes with node.js

I have the following test code that is being ran by jasmine-node in a file called bob_test.spec.js

require('./bob');  describe("Bob", function() {   var bob = new Bob();    it("stating something", function() {     var result = bob.hey('Tom-ay-to, tom-aaaah-to.');     expect(result).toEqual('Whatever');   }); }); 

In order to make the test pass, I've written the following production code in a file called bob.js

"use strict";  var Bob = function() { }  Bob.prototype.hey = function (text) {   return "Whatever"; }  module.exports = Bob; 

When I run the test - using jasmine-node . - I get the following F

Failures:  1) Bob encountered a declaration exception Message:     ReferenceError: Bob is not defined Stacktrace:     ReferenceError: Bob is not defined     at null.<anonymous> (/Users/matt/Code/oss/deliberate-practice/exercism/javascript/bob/bob_test.spec.js:4:17)     at Object.<anonymous> (/Users/matt/Code/oss/deliberate-practice/exercism/javascript/bob/bob_test.spec.js:3:1)     at Module._compile (module.js:456:26)     at Object.Module._extensions..js (module.js:474:10)     at Module.load (module.js:356:32)     at Function.Module._load (module.js:312:12)     at Module.require (module.js:364:17)     at require (module.js:380:17)  Finished in 0.02 seconds 1 test, 1 assertion, 1 failure, 0 skipped 

Based on what I understand about Javascript, I feel like this should work. What does node.js do differently with constructor functions and module exports that prevents this from working I like think it should?

like image 610
mattr- Avatar asked Aug 02 '13 14:08

mattr-


People also ask

Can we export class in NodeJS?

As we just saw, exporting a class can be accomplished by attaching the class as a property of the module. exports object. First, we created a class using a constructor function. Then we exported the class using module.

Can you export classes in JavaScript?

Use named exports to export a class in JavaScript, e.g. export class Employee {} . The exported class can be imported by using a named import as import {Employee} from './another-file. js' . You can use as many named exports as necessary in a file.


2 Answers

require returns an object, you should store it somewhere

var Bob = require('./bob'); 

and then use this object

var bobInstance = new Bob(); 
like image 108
mrvn Avatar answered Oct 07 '22 20:10

mrvn


If you can use ECMAScript 2015 you can declare and export your classes and then 'import' your classes using destructuring with no need to use an object to get to the constructors.

In the module you export like this

class Person {     constructor()     {         this.type = "Person";     } }  class Animal{     constructor()     {         this.type = "Animal";     } }  module.exports = {     Person,     Animal }; 

then where you use them

const { Animal, Person } = require("classes");  const animal = new Animal(); const person = new Person(); 
like image 34
Jonas Brandel Avatar answered Oct 07 '22 18:10

Jonas Brandel