2013-03-19 17 views
5

Sto utilizzando Windows Azure per distribuire un'applicazione node.js che ho scritto che espone un API REST CRUD piuttosto semplice ai client. È ospitato in un sito Web Windows Azure e utilizza MongoDB attraverso l'archivio Windows Azure con mangusta. Le richieste che sto facendo al servizio sono JSON e le risposte sono JSON (non sono sicuro che importi ma altri hanno parlato di 400 risposte alle richieste con un Content-Type di applicazione/json)Prima richiesta all'app node.js su Windows Azure con MongoDB restituisce 400 Richiesta errata

Al primo accesso in un a lungo, l'applicazione restituisce 400 Bad Request senza errori. Fintanto che tengo l'applicazione "calda" colpendola frequentemente (almeno una volta al minuto) - non mi sembra di averlo mai più.

Non ha importanza nell'impostazione di ridimensionamento dell'hosting: ottengo la stessa cosa sul livello gratuito come in modalità riservata.

Qualcun altro ha visto questo?

+4

Questo può avere a che fare con il riciclaggio automatico in IIS. Se inattivo, il processo di hosting viene riciclato, quindi hai perso qualsiasi stato (probabilmente la tua connessione mongodb). Potresti provare una sorta di connessione keepalive o codice per il ripristino da una connessione interrotta nell'app –

+1

Hai controllato i log e richiesto maggiori informazioni sugli errori? –

+0

Hai provato a prendere in giro la parte MongoDB e controllare se restituisce ancora 400 alla prima richiesta? –

risposta

1

Al fine di garantire l'accesso a qualsiasi connessione in node.js, si devono mettere tutto il codice che richiede una connessione interna del callback. Il modo in cui la mangusta espone questa connessione è attraverso un evento. Quando l'evento 'open' viene chiamato dalla connessione mangusta, allora si ha accesso a una connessione al database.

I.E.

mongoose.connect('details'); 

mongoose.on('open', function() { 
    var connection = mongoose.connection; 

    // Do things with your connection here 
    doThings(connection); 
}); 

function doThings(connection) { 
    app.get(...); 
} 
0

Sarebbe utile se si avesse uno snippet di codice, ma suppongo che la connessione a mongo avvenga in modo asincrono e che il sito stia servendo la richiesta prima che la connessione sia effettivamente aperta.

Ho verificato questo scenario e non è stato possibile riprodurre il problema. Puoi vedere il mio codice qui: https://github.com/ntotten/azure-mongo-sample

Fondamentalmente, sto usando mangusta per connettersi e la connessione sta accadendo subito quando l'app è caricata. Puoi vedere il codice qui sotto.

app.js:

/** 
* Module dependencies. 
*/ 

var express = require('express') 
    , routes = require('./routes') 
    , user = require('./routes/user') 
    , http = require('http') 
    , path = require('path'); 

var TaskList = require('./routes/tasklist'); 
var taskList = new TaskList(process.env.CUSTOMCONNSTR_MONGOLAB_URI); 

... 

tasklist.js:

var mongoose = require('mongoose') 
    , task = require('../models/task.js'); 


module.exports = TaskList; 


function TaskList(connection) { 
    mongoose.connect(connection); 
} 

... 
+0

Grazie Nathan - Ho provato il tuo approccio e posso ancora riprodurre il problema. Il mio codice è qui https://github.com/timfpark/nodejs-azure-mongodb – outside2344

Problemi correlati