includere un file .js esterno nell'app node.js


97

Ho un'applicazione del nodo app.js. Dato che questo file sta iniziando a crescere, vorrei spostare una parte del codice in altri file che vorrei "richiedere" o "includere" nel file app.js.

Sto provando cose come:

// Declare application
var app = require('express').createServer();

// Declare usefull stuff for DB purposes
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var ObjectId = Schema.ObjectId;

// THE FOLLOWING REQUIRE DOES NOT WORK
require('./models/car.js');

in car.js:

// Define Car model
CarSchema = new Schema({
  brand        : String,
  type : String
});
mongoose.model('Car', CarSchema);

Ho ricevuto l'errore:

ReferenceError: Schema is not defined

Sto solo cercando di caricare il contenuto di car.js (invece di avere tutto nello stesso file app.js) C'è un modo particolare per farlo in node.js?


1
Lo schema non esiste in tale ambito. Potresti provare a passare Schema in car.js attraverso una sorta di funzione esportata, in questo modo puoi fare riferimento ad esso. Quello o richiede mangusta all'interno di car.js.
Robert

3
Node.js utilizza CommonJS, che divide il codice in diversi moduli. La regola pratica rapida, l'ambito del codice in un'app Node è il file in cui è definito. Quindi dovrai richiedere mongoose in car.js e in car.js dovrai esportare qualunque cosa il resto della tua app necessita quindi richiederlo nel file principale come si fa.
Matt Greer

Risposte:


100

Mettere l'accento su ciò che tutti gli altri hanno detto var fooal massimo livello non crea una variabile globale. Se vuoi una variabile globale, scrivi global.foo. ma sappiamo tutti che i globali sono il male.

Se sei qualcuno che usa le globali in questo modo in un progetto node.js su cui mi trovavo, li rifattorizzerei via perché ci sono pochi casi d'uso per questo (ci sono alcune eccezioni ma questa non è una).

// Declare application
var app = require('express').createServer();

// Declare usefull stuff for DB purposes
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var ObjectId = Schema.ObjectId;

require('./models/car.js').make(Schema, mongoose);

in car.js

function make(Schema, mongoose) {
    // Define Car model
    CarSchema = new Schema({
      brand        : String,
      type : String
    });
    mongoose.model('Car', CarSchema);
}

module.exports.make = make;

32
Suggerimento per chiunque legga, puoi semplicemente fare exports.foo, piuttosto che module.exports.foo
Tyler Egeto

9
@TylerEgeto Mi sento sempre più sicuro se uso la versione più lunga;)
Raynos

3
Potresti espandere l'esempio per mostrare come si possono utilizzare le variabili definite all'interno di car.js nell'app principale? es. `function make (...) {... CarModel = mongoose.model ('Car', CarSchema); } `All'interno dell'app, come si usa CarModel?
Marius

:)) Ok, che ne dici di impostare più variabili all'interno della funzione? es. più modelli, o anche 3 modelli e 2 qualcos'altro? Devono essere restituiti come parte di un oggetto? ad esempioreturn {models: {car: CarModel, dealer: CarDealer}, carStuff: carStuff}
Marius

56

La risposta corretta di solito è usare require, ma in alcuni casi non è possibile.

Il codice seguente farà il trucco, ma usalo con attenzione:

var fs = require('fs');
var vm = require('vm');
var includeInThisContext = function(path) {
    var code = fs.readFileSync(path);
    vm.runInThisContext(code, path);
}.bind(this);
includeInThisContext(__dirname+"/models/car.js");

2
Il problema è: "Il codice in esecuzione non ha accesso all'ambito locale". nodejs.org/api/vm.html#vm_vm_runinthiscontext_code_filename
Petah

Com'è questo #include?
Steven Lu

18

Risposta breve:

// lib.js
module.exports.your_function = function () {
  // Something...
};

// app.js
require('./lib.js').your_function();

Questo non funziona per me. Ricevo un errore Cannot find module lib.js.
Manoj

2
@Manoj devi anteporre a lib.js ./ in questo modo:require('./lib.js').your_function()
Chris

8

Puoi mettere

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

nella parte superiore del file car.js affinché funzioni, oppure puoi fare ciò che Raynos ha detto di fare.


4

Se vuoi solo testare una libreria dalla riga di comando, potresti fare:

cat somelibrary.js mytestfile.js | node

0

Questo approccio funziona per me in Node.js, c'è qualche problema con questo ?

File "include.js":

fs = require('fs');

File "main.js":

require('./include.js');

fs.readFile('./file.json', function (err, data) {
    if (err) {
        console.log('ERROR: file.json not found...')
    } else {
        contents = JSON.parse(data)
    };
})

Questo è sbagliato. "fs" non viene mai esportato! Non funzionerebbe in modalità rigorosa che è l'impostazione predefinita in ES6
MyUserInStackOverflow
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.