2014-06-09 6 views
5

के साथ नहीं चल रहा है मैं node.js + express और iisnode के साथ कुछ प्रयोग कर रहा हूं। मैं निम्नलिखित बहुत ही सरल अनुप्रयोग, C:\tsapp-deploy\tsappsvr\TestExpress\0.0.0 में स्थित है:नोड.जेएस + एक्सप्रेस आधारित ऐप iisnode

app.js:

var express = require('express'); 
var app = express(); 
app.use(express.static(__dirname + "/public")); 

var port = process.env.PORT || 2709; 
app.listen(port, function() { 
    console.log('Listening on port ' + port); 
}); 

package.json:

{ 
    "name": "TestExpress", 
    "version": "0.0.0", 
    "private": true, 
    "dependencies": { 
    "express": "3.x" 
    } 
} 

web.config:

<configuration> 
    <system.webServer> 
    <handlers> 
     <add name="iisnode" path="app.js" verb="*" modules="iisnode" /> 
    </handlers> 
    </system.webServer> 
</configuration> 

सार्वजनिक/index.html:

<!doctype html> 
<html> 
<head> 
    <script language="javascript" type="text/javascript" src="js/jquery.js"></script> 
    <script language="javascript" type="text/javascript"> 
    $(document).ready(function() { 
     console.log("READY!"); 
     $("#hello").html("Hello, World!"); 
    }); 
    </script> 
</head> 
<body> 
    <h1 id="hello" style="text-align:center;"></h1> 
</body> 
</html> 

मेरा कॉन्फ़िगरेशन है: विंडोज 8.1, आईआईएस 8; iisnode संस्करण 0.2.11, नोड संस्करण v0.10.28।

कमांड लाइन (C:\tsapp-deploy\tsappsvr\TestExpress\0.0.0>node app.js) से लॉन्च होने पर, ऐप अपेक्षित रूप से चलता है: ब्राउज़र में, मैं http://localhost:2709/ पर जाता हूं और "हैलो, वर्ल्ड!" देखता हूं।

मेरा आईआईएस वर्तमान में अन्य नोड.जेएस-आधारित अनुप्रयोगों को चला रहा है जो समान स्थानों से एक्सप्रेस का उपयोग नहीं कर रहे हैं (यानी C:\tsapp-deploy\tsappsvr\appname\x.y.z\index.js से), इसलिए मुझे लगता है कि इसे सही तरीके से कॉन्फ़िगर किया जाना चाहिए, लेकिन जब मैं ब्राउज़र से इस ऐप को चलाने की कोशिश करता हूं, टाइपिंग http://localhost/tsappsvr/TestExpress/0.0.0/app.js मुझे क्रोम और फ़ायरफ़ॉक्स में 404 नहीं मिला (आईई में) या "/tsappsvr/TestExpress/0.0.0/app.js" प्राप्त नहीं हो सकता है।

मुझे लगता है कि समस्या मेरे web.config में हो सकती है, लेकिन मैं यह नहीं समझ सकता कि मेरे ऐप को काम करने के लिए इसे कैसे बदला जाए। मैंने web.config में कई बदलावों की कोशिश की है जैसा कि समान प्रश्नों के अन्य उत्तरों में सुझाया गया है, लेकिन अभी तक कोई सफलता नहीं है। कोई सुझाव?

अग्रिम धन्यवाद।

उत्तर

3

एरिक, क्या आपने url-rewrite extension इंस्टॉल किया है?

<configuration> 
<system.webServer> 

    <handlers> 
    <add name="iisnode" path="app.js" verb="*" modules="iisnode" /> 
    </handlers> 

    <rewrite> 
    <rules> 
     <rule name="myapp"> 
     <match url="/*" /> 
     <action type="Rewrite" url="app.js" /> 
     </rule> 
    </rules> 
    </rewrite> 
<system.webServer>  
<configuration> 
+0

धन्यवाद डेविड, मेरे पास यूआरएल-रीराइट एक्सटेंशन स्थापित नहीं था। अब मेरे पास है और मैंने rewrite नियम को web.config द्वारा जोड़ा है, लेकिन अभी तक कोई भाग्य नहीं है। मैं केवल अपने app.js को बदलने के जवाब में प्रतिक्रिया प्राप्त करने के लिए सफल हूं: 'var express = requ ('express'); var http = आवश्यकता ('http'); var app = express(); ऐप.यूज (फ़ंक्शन (रिक, आरएस, अगली) { res.send ('हैलो, वर्ल्ड!'); }); var सर्वर = http.createServer (ऐप); var port = process.env.PORT || 2709; server.listen (पोर्ट); ', लेकिन जब मैं' app.use ("/ static", express.static (__ dirname + '/ public') जैसे कुछ कोशिश करता हूं); 'मेरा ऐप कैच-ऑल मिडलवेयर में गिरता रहता है। – eca

11

मुझे लगता है कि मैं अपने समस्या का समाधान मिल गया है:

यहाँ विन्यास मैं अपने web.config में है

  • सबसे पहले मैं यूआरएल-पुनर्लेखन एक्सटेंशन स्थापित किया, धन्यवाद फिर, डेविड।

web.config:

<configuration> 
    <system.webServer> 
    <handlers> 
     <add name="iisnode" path="app.js" verb="*" modules="iisnode" /> 
    </handlers> 
    <rewrite> 
     <rules> 
     <rule name="myapp"> 
      <match url="/*" /> 
      <action type="Rewrite" url="app.js" /> 
     </rule> 
     </rules> 
    </rewrite> 
    </system.webServer> 
    <appSettings> 
    <add key="deployPath" value="/tsappsvr/TestExpress/0.0.0" /> 
    </appSettings> 
</configuration> 

कृपया ध्यान दें appSettings खंड में deployPath कुंजी, जिसका मूल्य एप्लिकेशन की आभासी पथ पर सेट है (सेट

  • दूसरी बात मैं अपने web.config इस प्रकार बदल आईआईएस में)। मेरे मामले में यह /tsappsvr/TestExpress/0.0.0 है।
  • एप्लिकेशन:

    • अंत में, मेरी app.js अब इस प्रकार है।js:

      // Preamble, so to say 
      var express = require('express'); 
      var http = require('http'); 
      var app = express(); 
      
      // Variable deployPath is set in web.config and must match 
      // the path of app.js in virtual directory. 
      // If app.js is run from command line: 
      // "C:/tssapp-deploy/tsappsvr/TestExpress/0.0.0> node app.js" 
      // deployPath is set to empty string. 
      var deployPath = process.env.deployPath || ""; 
      
      // Static content server 
      app.use(deployPath + "/pages", express.static(__dirname + '/public')); 
      
      // REST API handler (placeholder) 
      app.all(deployPath + "/api", function(req, res) { 
          res.writeHead(200, {'Content-Type': 'text/html'}); 
          res.end("<h2>REST API Handler found.</h2>"); 
      }); 
      
      // Default handler 
      app.get(deployPath + "/", function(req, res) { 
          res.writeHead(200, {'Content-Type': 'text/html'}); 
          res.end("<h2>Default Handler found.</h2>"); 
      }); 
      
      // Not Found handler 
      app.use(function(req, res, next){ 
          res.writeHead(404, {'Content-Type': 'text/html'}); 
          res.write("<h2>The requested resource is not available.</h2>"); 
          res.write("Request received on port " + process.env.PORT + "<br>"); 
          res.write("Request URL: " + req.url + "<br>"); 
          res.write("Deploy Path: " + deployPath + "<br>"); 
          res.end('[iisnode version is ' + process.env.IISNODE_VERSION + ', node version is ' + process.version + ']'); 
      }); 
      
      // Server creation 
      var server = http.createServer(app); 
      var port = process.env.PORT || 2709; 
      server.listen(port); 
      

      चर deployPath सभी संचालकों के लिए एक उपसर्ग ("नहीं मिला" हैंडलर को छोड़कर) के रूप में प्रयोग किया जाता है। जब iisnode से app.js लॉन्च किया जाता है, तो तैनातीपैथ process.env का हिस्सा है, जबकि यह अपरिभाषित है यदि app.js कमांड लाइन से लॉन्च किया गया है (उदा। C:/tsapp-deploy/tsappsvr/TestExpress/0.0.0>node app.js)। यह सुनिश्चित करता है कि app.js दोनों मामलों में काम करता है।

      अब, ब्राउज़र में http://localhost/tsappsvr/TestExpress/0.0.0/ टाइप करना मैं डिफ़ॉल्ट हैंडलर को आग लगाता हूं; /pages को पूर्व यूआरएल में जोड़ना मेरे पास स्थिर सामग्री तक पहुंच है, जबकि /api जोड़कर मैं आरईएसटी एपीआई हैंडलर को आग लगाता हूं। आधार URL के रूप में http://localhost:2709/ के लिए भी ऐसा ही होता है।

    +0

    तैनाती पाथ मेरे लिए निश्चित चीजें जोड़ना। धन्यवाद! – Beanwah

    +0

    मुझे सार्वजनिक/जावास्क्रिप्ट या सार्वजनिक/स्टाइलशीट निर्देशिकाओं के अंदर मौजूद स्थिर स्थिर सामग्री की सेवा करने में समस्याएं आ रही हैं। मैं app.use का उपयोग कर रहा हूं (express.static (path.join (__ dirname, deployPath, 'public'))); मेरी एक्सप्रेस app.js फ़ाइल में – Robodude

    +0

    इसे समझ लिया गया: app.use (deployPath, express.static (path.join (__ dirname, 'public'))); – Robodude

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