2016-05-11 10 views
11

मेरी स्थिति यह है कि मुझे अपने सर्वर रहित फ्रेमवर्क प्रोजेक्ट (विशिष्ट पैकेज geopoint) में बाहरी एनपीएम पैकेज जोड़ने में कुछ परेशानी हो रही है।सर्वर रहित फ्रेमवर्क: बाहरी एनपीएम पैकेज कैसे जोड़ें?

मैं सर्वरलेस प्रोजेक्ट के रूट फ़ोल्डर में गया और npm install geopoint --save चला गया। package.json को dependencies": { "geopoint": "^1.0.1" } के साथ अद्यतन किया गया है और node_modules फ़ोल्डर बनाया गया था।

मेरे फ़ोल्डर संरचना इस तरह दिखता है:
रूट परियोजना फ़ोल्डर
-functions
--geospatial
--- handler.js
-node_modules
--geopoint

में मेरी फ़ंक्शन/भू-स्थानिक/हैंडलर.जेएस मैंने भूगर्भीय मॉड्यूल को घोषित किया:

var geopoint = require('geopoint'); 
    var geopoint = require('../../geopoint'); 
    var geopoint = require('../../../geopoint'); 

लैम्ब्डा सांत्वना का एक त्रुटि देता है:

{ 
     "errorMessage": "Cannot find module '../../geopoint'", 
     "errorType": "Error", 
     "stackTrace": [] 
    } 

मैं कैसे ठीक से एक Serverless फ्रेमवर्क परियोजना के लिए बाहरी NPM मॉड्यूल जोड़ सकते हैं?

+1

तुम क्यों और हल करने के लिए '../ geopoint' कोशिश कर रहे हैं' में ../../ geopoint' प्रथम स्थान? क्या यह सर्वर रहित के लिए विशिष्ट है? –

उत्तर

17

मुझे लगता है कि आप जो अनुभव कर रहे हैं वह वही है जो मैं हाल ही में अनुभव कर रहा था। मैं अपने आवेदन रूट निर्देशिका में एनपीएम पैकेज स्थापित कर सकता हूं, लेकिन लैम्ब्डा में कुछ भी तैनात नहीं किया जाएगा।

मेरी समझ यह है कि सर्वर रहित प्रत्येक घटक निर्देशिका (अनुप्रयोग रूट के तहत उपनिर्देशिका) के तहत सबकुछ तैनात करता है। आपके मामले में, functions के तहत।

मुझे इसके आसपास सर्वर रहित दस्तावेज में बहुत कुछ नहीं मिला, लेकिन मैंने जो किया वह package.json फ़ाइल को मेरे functions फ़ोल्डर के तहत परिभाषित किया गया था और फिर उस उपनिर्देशिका में एक npm इंस्टॉल चलाया गया था। फिर लैम्ब्डा को तैनात करने के बाद, node_modules इस निर्देशिका के तहत भी तैनात किया गया, जिसका अर्थ है कि मेरे फ़ंक्शन कोड को इनमें से किसी भी एनपीएम मॉड्यूल की आवश्यकता हो सकती है।

तो, अपने फ़ोल्डर संरचना अब इस तरह दिखना चाहिए:

root-project-folder 
|-functions 
|--package.json 
|--node_modules 
|---geopoint 
|--geospatial 
|---handler.js 
|-package.json 
|-node_modules 
|--geopoint 

यहाँ लाभ के रूप में अच्छी तरह से है कि आप केवल NPM निर्भरता है कि अपने कार्यों की जरूरत तैनात कर सकते हैं, उन के बिना कि serverless अपने संसाधनों को तैनात करने की जरूरत है ।

उम्मीद है कि यह मदद करता है - एक बार फिर, यह सुनिश्चित नहीं है कि यह सबसे अच्छा अभ्यास है, बस मैं क्या करता हूं क्योंकि यह कहीं भी दस्तावेज नहीं है जिसे मैं सर्वर रहित भंडार या किसी भी उदाहरण कोड में पा सकता हूं।

+2

हाय, उत्तर के लिए धन्यवाद लेकिन मुझे एक और तरीका मिला। फ़ंक्शन के s-functions.json में मैंने लाइन "हैंडलर" संपादित किया: "हैंडलर हैंडलर" 'से" हैंडलर ":" फ़ंक्शंस/भू-स्थानिक/get_bounding_coordinates/हैंडलर हैंडलर ", 'ताकि यह सेट हो सके नोड मॉड्यूल की निर्देशिका के लिए फंक्शन रूट। – taptipblard

+1

अरे वहाँ। हाँ, इसके माध्यम से भेजने के लिए धन्यवाद।मैंने पाया कि जब आपके सुझाव ने काम किया, तो 'स्लैश डैश तैनाती' में काफी समय लगा क्योंकि उसने मेरे रूट नोड_मोड्यूल फ़ोल्डर से भी विकास निर्भरताओं को बंडल करने की कोशिश की। जबकि मैं 'npm prune --prod' का उपयोग कर सकता हूं, मुझे लगता है कि मैं एक दूसरा नोड_मोड्यूल रखने जा रहा हूं जैसे कि मैं तेजी से तैनाती के लाभ के लिए अपने उत्तर में उपयोग करता हूं और हर बार जब मैं तैनाती करता हूं तो देव निर्भरताओं को छीनने के लिए नहीं। –

+1

आप सही हैं कि हैंडलर विशेषता के लिए उपयोग किए गए मान को संपादित करने का तरीका है। आपको अपने कार्यों को ढूढ़ने में सक्षम होना चाहिए ताकि आप किसी दिए गए फ़ंक्शन (ओं) में node_modules को बहुत विशिष्ट (जैसा चाहें) रख सकें। उदाहरण के लिए मेरे पास मेरे मुख्य प्रोजेक्ट के लिए एक पैकेज.जेसन है, और फिर दो अतिरिक्त पैकेज.जेसन फाइलें हैं, जो लैम्ब्डा कार्यों के प्रत्येक सेट के लिए एक है। – Mikelax

संबंधित मुद्दे