как отправить html с помощью restify

Я хочу отправить простой html Вместо ответа json для одного из моих маршрутов в restify. Я попытался установить свойство contentType и header ответа, но он, похоже, не устанавливает contentType в заголовке (браузер пытается загрузить файл, а не отображать его).

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

4 ответов


быстрый способ управления заголовками без изменения форматеров для всего сервера:

объект restify response также имеет все "сырые" методы Node ServerResponse.

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

Если вы перезаписали форматеры в конфигурации restify, вам нужно будет убедиться, что у вас есть форматер для text/html. Итак, это пример конфигурации, которая будет отправлять JSON и JSONP-стиль или html в зависимости от contentType, указанного в объекте ответа (res):

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

другой вариант-вызов

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

вместо

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

похоже, что поведение @dlawrence, описанное в его ответе, изменилось с момента публикации ответа. Как это работает сейчас (по крайней мере в restify 4.х):

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