2012-05-07 19 views
19

Mam aplikacji, która korzysta z modułu TWIT węzła, który jest dostępny za pośrednictwemJak mogę wdrożyć moduły węzłów w aplikacji Meteor na stronie meteor.com?

npm install twit 

I wdrożony moduł węzła lokalnie z .meteor/local/build/server/

Tak, to jest widoczne na .meteor/local/build/server/node_modules/twit

Próbowałem zainstalować go w katalogu głównym projektu, ale projekt nie znalazł modułu. Które doprowadziły mnie do powyższego rozwiązania, które działa.

Moja aplikacja działa teraz dobrze. Jestem w stanie uruchomić i zrobić wszystko, i mogę wchodzić w interakcje z Twitterem po stronie serwera Meteor lub po stronie klienta, w zależności od tego, co chcę zrobić. Bez awarii.

Kiedy wdrożyć do meteor.com poprzez komendy

meteor deploy [appname] --password 

Aplikacja instaluje się pomyślnie.

Kiedy próbuję uzyskać dostęp do (aplikacji na stronie anonistream.meteor.com) [anonistream.meteor.com] z przeglądarki, to się ona nie powiedzie i dzienniki zawierają ten błąd.

[Mon May 07 2012 01:59:53 GMT+0000 (UTC)] WARNING 
node.js:201 
    throw e; // process.nextTick error, or 'error' event on first tick 
     ^
Error: Cannot find module 'twit' 
at Function._resolveFilename (module.js:332:11) 
at Function._load (module.js:279:25) 
at Module.require (module.js:354:17) 
at require (module.js:370:17) 
at app/server/server.js:2:12 
at /meteor/containers/84162a7c-24e8-bf26-6fd8-e4ec13b2a935/bundle/server/server.js:111:21 
at Array.forEach (native) 
at Function.<anonymous> 
(/meteor/containers/84162a7c-24e8-bf26-6fd8-  e4ec13b2a935/bundle/server/underscore.js:76:11) 
at /meteor/containers/84162a7c-24e8-bf26-6fd8-e4ec13b2a935/bundle/server/server.js:97:7 
[Mon May 07 2012 01:59:53 GMT+0000 (UTC)] INFO STATUS running -> waiting 
[Mon May 07 2012 01:59:53 GMT+0000 (UTC)] ERROR Application crashed with code: 1 
[Mon May 07 2012 02:29:55 GMT+0000 (UTC)] INFO HIT/24.94.158.145 
[Mon May 07 2012 02:29:59 GMT+0000 (UTC)] INFO HIT /favicon.ico 24.94.158.145 
[Mon May 07 2012 02:30:46 GMT+0000 (UTC)] INFO HIT/24.94.158.145 
[Mon May 07 2012 02:30:50 GMT+0000 (UTC)] INFO HIT /favicon.ico 24.94.158.145 

Czy ktoś ma jakieś sugestie, w jaki sposób można to osiągnąć?

+0

Tylko sprawdzam ... ale jest wyśmiać zawarte w pliku 'package.json'? – rjz

+0

Nie wiedziałem, że muszę zbudować pakiet meteorów, aby włączyć wtyczkę do mojego wdrożenia. Będę musiał sprawdzić, czy tak jest. Założono, że wszystko w module node_modules zostało bezpośrednio wypchnięte na wdrożenie. Mam zamiar przekopać się przez źródło jutro, aby zobaczyć, co mogę znaleźć! Chyba, że ​​ktoś inny opublikuje odpowiedź! –

+0

Szczerze mówiąc, nie jestem też pewien ... nie mogę się doczekać, aby usłyszeć, co inni mają do powiedzenia. – rjz

Odpowiedz

8

Wreszcie, napisałem tak. działa zarówno na serwerze lokalnym, jak i meteorytowym. Ian thx: D

zainstalować moduł npm wewnątrz "app/publiczne":

 
    app/public# npm install MODULE_NAME 

wewnątrz aplikacji/server/server.js:

Meteor.startup(function() { 
    var require = __meteor_bootstrap__.require; 
    var path = require('path'); 
    var base = path.resolve('.'); 
    var isBundle = path.existsSync(base + '/bundle'); 
    var modulePath = base + (isBundle ? '/bundle/static' : '/public') + '/node_modules'; 

    var MODULE_NAME = require(modulePath + '/MODULE_NAME'); 
}); 
+0

Spektrum, czy jesteś w stanie podać dowolny przykład? Nie mogę sprawić, żeby to działało. Za każdym razem, gdy wprowadzam zmiany w folderze aplikacji, zostaje on nadpisany po ponownym uruchomieniu meteorytu. – Martin

+0

W porządku, mam to działa. Musiał dodać tę linię: 'var fs = require ('fs');' i zmodyfikuj: 'var isBundle = path.existsSync (base + '/ bundle'); do ' var isBundle = fs.existsSync (base + '/ bundle'); ' – Martin

+3

Uwaga: ponieważ Meteor 0.6.0,' __meteor_bootstrap __. require' został zastąpiony przez [Npm.require()] (http://stackoverflow.com/a/15351543/1269037) –

7

Odpowiedź znaleziona przez JonathanKingston na meteor irc. Określono jako meteoric project

Umieść moduły węzłów w katalogu publicznym projektów.

Użyj tego kodu, aby się upewnić, że się załadował.

var require = __meteor_bootstrap__.require; 
var path = require("path"); 
var fs = require('fs'); 
var Twit; 
var twitPath = 'node_modules/twit'; 

var base = path.resolve('.'); 
if (base == '/'){ 
    base = path.dirname(global.require.main.filename); 
} 

var publicPath = path.resolve(base+'/public/'+twitPath); 
var staticPath = path.resolve(base+'/static/'+twitPath); 

if (path.existsSync(publicPath)){ 
    Twit = require(publicPath); 
} 
else if (path.existsSync(staticPath)){ 
    Twit = require(staticPath); 
} 
else{ 
    console.log('node_modules not found'); 
} 

meteor wdrożyć powinny działać znaleźć po tym, parapet mnie na oddanie moich modułów węzła w katalogów serwera

+1

Zostawiłeś linię kodu, która pozwala ci "wymagać" na Meteor: 'var require = __meteor_bootstrap __. Require;'. To mnie trochę potknęło i wiem, że wielu ludzi jest tutaj wskazywanych przez IRC. – Lsdafjklsd

+0

Zbiornik u @ Lsdafjklsd Edytuję post i dodałem go –

+0

path.existsSync() jest teraz fs.existsSync() – Pent

0

Ty

base = base + "/bundle" 

aby uzyskać to do pracy.

14

Od Meteor 6.0, teraz musimy zamiast tego użyj Npm.require(). Dodatkowo musimy zadeklarować moduł jako zmienne globalne, ponieważ Meteor ma teraz zasięg na poziomie pliku.

var path = Npm.require('path'); 
    var fs = Npm.require('fs'); 
    var base = path.resolve('.'); 
    var isBundle = fs.existsSync(base + '/bundle'); 
    var modulePath = base + (isBundle ? '/bundle/static' : '/public') + '/node_modules'; 
    MODULE_NAME = Npm.require(modulePath + '/MODULE_NAME'); // NOTE, this is going to be a global variable 
+0

Czy możesz wyjaśnić, gdzie umieścić instrukcję Npm.require() w projekcie meteorytowym? – supertrue

+0

Więc używając pakietów npm w Meteororze, musisz zrobić to w ten sposób, zamiast tylko używać Meteor.require? Jeśli moduł npm znajduje się w folderze public/node_modules, czy moduł npm jest dostępny zarówno na kliencie, jak i na serwerze? Czy ta metoda używania modułów npm prowadzi do problemów na drodze? Jestem po prostu zdezorientowany, jak najlepiej zintegrować moduły npm z moim projektem, aby użyć ich na serwerze. – nearpoint

+0

@supertrue: Mój komentarz jest nieco spóźniony, ale jest to rodzaj odpowiedzi na odpowiedź według widma (obecnie akceptowana odpowiedź). Tak może być w app/server/server.js. –

4

Właśnie spędziłem pół godziny zastanawianie się „Instalacja modułu npm wewnątrz app/public kroku i pomyślałem, że następna osoba zaoszczędzić trochę czasu.Od Twojej aplikacji katalogu domowym:

cd public 
mkdir node_modules 
npm install foo 

Domyślnie npm install foo instaluje „lokalnie”, ale jeśli nie ma node_modules folderu w bieżącym katalogu, a następnie przemieszcza się w górę drzewa katalogów patrząc na jeden. Kończyłem instalację pakietu w $HOME/node_modules/foo zamiast projektu lokalnego. Dobrze dla localhost, ale nie tak dużo dla wdrożenia.

(Dzięki npm install locally do rozwiązania mojego problemu root.)

+3

Kontynuacja: Jakiś czas później znalazłem pakiet meteorytów 'npm' do robienia tego typu rzeczy, i działa jak urok. Jeśli tu trafiłeś, możesz zapoznać się z artykułem [Meteor Hacks] (http://meteorhacks.com/complete-npmegrand-for-meteor.html) na ten temat. –

2

Ten kod pracował dla mnie z meteorytów 0.8.x i node_modules instalowane w ./public mojej aplikacji:

var path = Npm.require('path') 
var fs = Npm.require('fs') 
var base = path.resolve('.') 
var isBundle = fs.existsSync(base + '/bundle') 
var modulePath = base + (isBundle ? '/bundle/static' : '/../client/app') + '/node_modules/' 

var twit = Npm.require(modulePath+'rssparser') 

Może ona również dobrym pomysłem jest utworzenie pliku packages.json w ./public dla łatwiejszych aktualizacji/instalacji poprzez npm.

Niech żyje Meteor!

+0

Po uruchomieniu na moim lokalnym mogę po prostu npm zainstalować w folderze głównym dla mojej aplikacji, a następnie użyć Meteor.require ("pakiet") Ale podczas przesyłania na serwery testowe Meteor.com musiałem to zrobić w ten sposób. Czy to jest to samo, co przy użyciu Meteor.require()? Czy napotkasz jakieś wady? – nearpoint

1

Zmieniono:

var modulePath = base + (isBundle ? '/bundle/static' : '/../client/app') + '/node_modules/' 

do:

var modulePath = base + (isBundle ? '/bundle/static' : '/../web.browser/app') + '/node_modules/' 
+1

INSANE! Uderzyłeś we właściwym momencie dokładnie wtedy, kiedy tego potrzebowałem –

Powiązane problemy