2012-06-11 5 views
14

Ich möchte plain html anstelle einer JSON Antwort für eine meiner Routen in restify senden. Ich habe versucht, die contentType und Header-Eigenschaft der Antwort zu setzen, aber es scheint nicht den contentType in der Kopfzeile zu setzen (der Browser versucht, die Datei herunterzuladen, anstatt sie zu rendern).Wie sende ich html mit restify

res.contentType = 'text/html'; 
res.header('Content-Type','text/html'); 
return res.send('<html><body>hello</body></html>'); 

Antwort

21

Schnell Art und Weise zu manipulieren Header ohne Änderung Formatierer für die ganzen server:

Ein Restify Response Objekt hat alle "rohen" Methoden eines Node ServerResponse darauf.

var body = '<html><body>hello</body></html>'; 
res.writeHead(200, { 
    'Content-Length': Buffer.byteLength(body), 
    'Content-Type': 'text/html' 
}); 
res.write(body); 
res.end(); 
+2

Muss dies nicht mit einem Aufruf von 'next()' enden? – Justin

+0

Dies funktioniert nicht, wenn die gzip-Codierung verwendet wird. Es ist besser, einen benutzerdefinierten Antwortformatierer zu verwenden und res.send zu verwenden, damit die korrekte Inhaltslänge berechnet wird. –

11

Wenn Sie die Formatierer in der restify Konfiguration überschrieben haben, werden Sie sicher, müssen Sie einen Formatierer für text/html haben. Also, das ist ein Beispiel für eine Konfiguration, die json und JSONP-Stil oder html abhängig von der content angegeben auf dem Antwortobjekt (res) senden:

var server = restify.createServer({ 
    formatters: { 
     'application/json': function(req, res, body){ 
      if(req.params.callback){ 
       var callbackFunctionName = req.params.callback.replace(/[^A-Za-z0-9_\.]/g, ''); 
       return callbackFunctionName + "(" + JSON.stringify(body) + ");"; 
      } else { 
       return JSON.stringify(body); 
      } 
     }, 
     'text/html': function(req, res, body){ 
      return body; 
     } 
    } 
}); 
+0

FWMI. Sie können den ursprünglichen Formatierer mithilfe der restify-Bibliothek neu zuweisen. Ersetzen Sie Zeile 3 durch: ''application/json': require ('restify/lib/formatters/json')' –

10

Eine weitere Option ist

res.end('<html><body>hello</body></html>'); 

Statt

res.send('<html><body>hello</body></html>'); 
3

Es scheint, zu nennen wie das Verhalten @dlawrence beschreibt in seiner Antwort, da, wenn die Antwort geändert hat geschrieben wurde. Die Art, wie es jetzt funktioniert (zumindest in Restify 4.x) ist:

const app = restify.createServer(
    { 
    formatters: { 
     'text/html': function (req, res, body, cb) { 
     cb(null, body) 
    } 
    } 
})