2013-02-12 27 views
44

Po prostu próbuję utworzyć serwer węzła, który wyprowadza status HTTP podanego URL.nodejs - pierwszy argument musi być łańcuchem lub Buforem - przy użyciu response.write z http.request

Kiedy próbuję opróżnić odpowiedź z res.write, pojawia się błąd: throw new TypeError ("pierwszy argument musi być ciągiem lub bufora");

Ale jeśli zamieniam je na console.log, wszystko jest w porządku (ale muszę je zapisać w przeglądarce, nie na konsoli).

Kod jest

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); 

wierzę Dodam wywołania zwrotnego gdzieś ale całkiem zdezorientowany i każda pomoc jest mile widziana.

Odpowiedz

8

Żądanie przyjmuje metodę zwrotną, asynchronicznie! Zakładam więc, że do czasu wywołania zwrotnego można wywołać res.end(). Spróbuj zamknąć żądanie w ramach oddzwaniania ?!

+1

Zrobiłem to i dodałem .toString. Dzięki wielkie. – umutm

+0

@umutm dlaczego nie przegłosować? –

+0

Wygląda na to, że zapomniałem. Właśnie to zrobiłem. Dzięki. – umutm

40

response.statusCode to liczba, np. response.statusCode === 200, a nie '200'. Zgodnie z komunikatem o błędzie, write oczekuje obiektu string lub Buffer, więc musisz go przekonwertować.

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

Masz również rację co do swojego komentarza zwrotnego. res.end(); powinien znajdować się wewnątrz oddzwonienia, tuż poniżej połączeń write.

+0

tak, że wystarczyły. Jako nowicjusz nodejów, nie wiedziałem o tym i dziękuję bardzo. – umutm

12

Oczywiście, próbujesz wysłać coś, co nie jest łańcuchem ani buforem. :) Działa z konsolą, ponieważ konsola akceptuje wszystko. Prosty przykład:

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

Jeden sposób przekonwertować niczego do łańcucha jest, aby to zrobić:

res.write("" + obj); 

ilekroć próbujesz wysłać coś. Innym sposobem jest wywołanie .toString() metody:

res.write(obj.toString()); 

pamiętać, że nadal nie może być to, czego szukasz. Powinieneś zawsze przekazywać ciągi/bufory do .write bez takich sztuczek.

Na marginesie: Zakładam, że request jest operacją asynchroniczną. Jeśli tak jest, to res.end(); zostanie wywołane przed każdym zapisaniem, tzn. Każde zapisanie i tak się nie powiedzie (ponieważ połączenie zostanie w tym momencie zamknięte). Przenieś linię do obsługi:

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

Dziękuję bardzo za odpowiedź i szczegółowe informacje. I, tak, przenieśliśmy res.end do obsługi. Zaakceptowałem @ loganfsmyth, tak jak było wcześniej. Jeszcze raz. – umutm

11

otrzymuję komunikat o błędzie i wymienia options.body

miałem ten pierwotnie

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

Zmieniłem go w ten sposób:

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

i wydaje się działać teraz bez komunikat o błędzie ...Wygląda na to bug choć

+2

Twój problem jest inny, treść jest domyślnie oczekiwana jako ciąg lub bufor. Możesz również zmienić (aby można było json serializować), dodając json: true do opcji. Np request.post ({ url: apiServerBaseUrl + '/ v1/zweryfikować' ciało: {email: req.user.email} json: true }) –

+0

można użyć tego uniknąć * * stringify ** '' 'javascript request.post ({ url: apiServerBaseUrl + '/ v1/zweryfikować' JSON: { email: req.user.email } } ' '' – bsorrentino

0

jeśli u chcą napisać obiekt JSON z odpowiedzią następnie zmienić typ zawartości nagłówka do 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(); 
Powiązane problemy