2017-06-15 2 views
0

J'ai un service d'application dans mon compte azur, qui exécute une application de nœud (Express, Angular et websockets). Je suis en mesure de fournir un contenu statique à mes utilisateurs, mais les API REST échouent avec l'erreur 404 introuvable.API REST Nodejs Express Router utilisant le service d'application azure

Après mon code dans mes index.js

var os = require('os'); 
var fs = require("fs"); 
var bodyParser = require('body-parser'); 
var express = require('express'), 
    expressApp = express(), 
    socketio = require('socket.io'), 
    http = require('http'), 
    uuid = require('node-uuid'), 
    config = require('../config/config.json'); 

var httpServer = http.createServer(expressApp), 
    rooms = {}, 
    userIds = {}; 
expressApp.use(express.static(__dirname + '/../public/dist/')); 
expressApp.use(bodyParser.urlencoded({ extended: true })); 
expressApp.use(bodyParser.json()); 
var router = express.Router(); 
expressApp.use('/api', router); 
router.get('/getsomethings', function(req, res) { 
    res.json(something); 
}); 
expressApp.use('/api', router); 
expressApp.listen = function listen() { 
    httpServer.listen(config.PORT); 
}; 

expressApp.listen(); 
exports.run = function(config) { 

    //some code 
}; 

Et voici mon web.config pour app.service

<configuration> 
    <system.webServer> 

    <handlers> 
     <!-- indicates that the app.js file is a node.js application to be handled by the iisnode module --> 
     <add name="iisnode" path="index.js" verb="*" modules="iisnode" /> 
    </handlers> 

    <rewrite> 
     <rules>   
     <!-- Don't interfere with requests for node-inspector debugging --> 
     <clear /> 
     <rule name="Redirect to https" stopProcessing="true"> 
      <match url=".*" /> 
      <conditions> 
       <add input="{HTTPS}" pattern="off" ignoreCase="true" /> 
      </conditions> 
      <action type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}" redirectType="Permanent" appendQueryString="false" /> 
     </rule> 

     <rule name="NodeInspector" patternSyntax="ECMAScript" stopProcessing="true"> 
      <match url="^index.js\/debug[\/]?" /> 
     </rule> 

     <!-- First we consider whether the incoming URL matches a physical file in the /public folder --> 
     <rule name="StaticContent"> 
      <action type="Rewrite" url="public{REQUEST_URI}" /> 
     </rule> 
     <!-- All other URLs are mapped to the Node.js application entry point --> 
     <rule name="DynamicContent"> 
      <conditions> 
      <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="True" /> 
      </conditions> 
      <action type="Rewrite" url="index.js" /> 
     </rule> 
     </rules> 
    </rewrite> 
    <security> 
     <requestFiltering> 
     <hiddenSegments> 
      <add segment="node_modules" /> 
     </hiddenSegments> 
     </requestFiltering> 
    </security> 
    <!-- You can control how Node is hosted within IIS using the following options --> 
    <!--<iisnode  
      node_env="%node_env%" 
      nodeProcessCountPerApplication="1" 
      maxConcurrentRequestsPerProcess="1024" 
      maxNamedPipeConnectionRetry="3" 
      namedPipeConnectionRetryDelay="2000"  
      maxNamedPipeConnectionPoolSize="512" 
      maxNamedPipePooledConnectionAge="30000" 
      asyncCompletionThreadCount="0" 
      initialRequestBufferSize="4096" 
      maxRequestBufferSize="65536" 
      watchedFiles="*.js" 
      uncFileChangesPollingInterval="5000"  
      gracefulShutdownTimeout="60000" 
      loggingEnabled="true" 
      logDirectoryNameSuffix="logs" 
      debuggingEnabled="true" 
      debuggerPortRange="5058-6058" 
      debuggerPathSegment="debug" 
      maxLogFileSizeInKB="128" 
      appendToExistingLog="false" 
      logFileFlushInterval="5000" 
      devErrorsEnabled="true" 
      flushResponse="false"  
      enableXFF="false" 
      promoteServerVars="" 
     />--> 

    </system.webServer> 
</configuration> 

Quand j'accéder à mon site Tout fonctionne bien, sauf que/getsomethings XHR donne l'erreur 404. Tous les contenus statiques sont bien servis.

Quelqu'un peut-il m'aider à comprendre ce qui ne va pas?

Répondre

1

Vous dites "Je suis en mesure de servir le contenu statique à mes utilisateurs", parce que vous avez cela dans web.config.

<!-- First we consider whether the incoming URL matches a physical file in the /public folder --> 
<rule name="StaticContent"> 
    <action type="Rewrite" url="public{REQUEST_URI}" /> 
</rule> 

Basé sur le code fourni ci-dessus, s'il vous plaît assurez-vous que la structure de votre dossier ressemble:

D:\home\site 
├── config 
│ └── config.json 
├── deployments 
│ └── ... 
├── locks 
│ └── ... 
├── Diagnostics 
│ └── ... 
├── public 
│ └── dist 
│  └── ... 
└── wwwroot 
    ├── node_modules 
    │ └── ... 
    ├── index.js 
    ├── package.json 
    └── web.config 

En outre, S'il vous plaît essayez de changer la ligne de code suivante:

httpServer.listen(config.PORT); 

à :

httpServer.listen(process.env.PORT || config.PORT); 
+0

Oui c'est la La structure du dossier que j'ai. Mais je ne suis pas en mesure d'obtenir une requête pour/api urls.J'ai essayé d'ajouter la règle pour/api url dans mon web.config, mais je suppose qu'il me manque quelque chose dans mon web.config. –

+0

Votre fichier web.config est bon. Je l'ai testé. Vous devrez peut-être [activer les journaux stdout et stdout] (https://stackoverflow.com/questions/44029083/how-to-enable-blob-logging-for-a-node-js-api-app-on-azure/ 44029658 # 44029658) pour résoudre ce problème. –

+0

Merci beaucoup @Aaron Je ne savais pas que je peux activer la connexion iisnode de telle manière. Ça va sûrement m'aider beaucoup. –