2013-02-12 11 views
44

Sto semplicemente cercando di creare un server nodo che restituisce lo stato HTTP di un determinato URL.nodejs - il primo argomento deve essere una stringa o un buffer - quando si utilizza response.write con http.request

Quando provo a svuotare la risposta con res.write, ottengo l'errore: lanciare un nuovo TypeError ("il primo argomento deve essere una stringa o un buffer");

Ma se li sostituisco con console.log, è tutto a posto (ma ho bisogno di scriverli sul browser e non sulla console).

Il codice è

var server = http.createServer(function (req, res) { 
    res.writeHead(200, {"Content-Type": "text/plain"}); 

    request({ 
     uri: 'http://www.google.com', 
     method: 'GET', 
     maxRedirects:3 
    }, function(error, response, body) { 
     if (!error) { 
      res.write(response.statusCode); 
     } else { 
      //response.end(error); 
      res.write(error); 
     } 
    });  

    res.end(); 
}); 
server.listen(9999); 

Credo che dovrei aggiungere un callback da qualche parte, ma piuttosto confuso e ogni aiuto è apprezzato.

risposta

8

La richiesta accetta un metodo di richiamata, è asincrono! Quindi presumo che, quando viene eseguita la richiamata, res.end() venga richiamato. Prova a chiudere la richiesta all'interno del callback ?!

+1

Questo ha anche aggiunto .toString. Grazie mille. – umutm

+0

@umutm perché non un upvote? –

+0

Sembra che mi sono dimenticato di. L'ho appena fatto. Grazie. – umutm

40

response.statusCode è un numero, ad es. response.statusCode === 200, non '200'. Come dice il messaggio di errore, write si aspetta un oggetto string o Buffer, quindi è necessario convertirlo.

res.write(response.statusCode.toString()); 

Anche tu sei corretto sul tuo commento di richiamata. res.end(); dovrebbe essere all'interno della richiamata, appena sotto le tue chiamate write.

+0

Sì, che ha fatto il trucco. Come novizio di un nodo, non lo sapevo e grazie mille. – umutm

12

Bene, ovviamente si sta tentando di inviare qualcosa che non sia una stringa o un buffer. :) Funziona con la console, perché la console accetta qualsiasi cosa. Esempio semplice:

var obj = { test : "test" }; 
console.log(obj); // works 
res.write(obj); // fails 

Un modo per convertire qualsiasi cosa per stringa è per farlo:

res.write("" + obj); 

ogni volta che si tenta di inviare qualcosa. L'altro modo è quello di chiamare il metodo .toString():

res.write(obj.toString()); 

Si noti che ancora potrebbe non essere quello che stai cercando. Devi sempre passare stringhe/buffer a .write senza trucchi del genere.

Come nota a margine: presumo che lo request sia un'operazione asincrona. In tal caso, verrà chiamato prima res.end(); prima di qualsiasi scrittura, vale a dire che qualsiasi scrittura fallirà comunque (poiché la connessione verrà chiusa in quel punto). Spostare quella riga nel gestore:

request({ 
    uri: 'http://www.google.com', 
    method: 'GET', 
    maxRedirects:3 
}, function(error, response, body) { 
    if (!error) { 
     res.write(response.statusCode); 
    } else { 
     //response.end(error); 
     res.write(error); 
    } 
    res.end(); 
}); 
+0

Grazie mille per la risposta e le informazioni dettagliate. E, sì, ho spostato il res.end nel gestore. Ho accettato @loganfsmyth com'era prima. Di nuovo. – umutm

11

ottengo questo messaggio di errore e si menziona options.body

ho avuto questa originariamente

request.post({ 
    url: apiServerBaseUrl + '/v1/verify', 
    body: { 
     email: req.user.email 
    } 
}) 

ho cambiato in questo:

request.post({ 
    url: apiServerBaseUrl + '/v1/verify', 
    body: JSON.stringify({ 
     email: req.user.email 
    }) 
} 

e sembra funzionare ora, senza il messaggio di errore ...sembra come bug se

+2

Il tuo problema è diverso, per impostazione predefinita il corpo è una stringa o un buffer. Puoi anche cambiarlo (per essere serializzabile con json) aggiungendo json: true alle opzioni. esempio: request.post ({url : apiServerBaseUrl + '/ v1/verifica', corpo: {email: req.user.email}, JSON: true} ) –

+0

si potrebbe usare questo per evitare * * ** stringa i '' 'javascript request.post ({url : apiServerBaseUrl + '/ v1/verifica', jSON: { email: req.user.email }} ' '' – bsorrentino

0

se volete scrivere un oggetto JSON alla risposta quindi modificare il tipo di contenuto intestazione a application/json

response.writeHead(200, {"Content-Type": "application/json"}); 
var d = new Date(parseURL.query.iso); 
var postData = { 
    "hour" : d.getHours(), 
    "minute" : d.getMinutes(), 
    "second" : d.getSeconds() 
} 
response.write(postData) 
response.end(); 
Problemi correlati