Search code examples
feathersjs

How to response a plain text in feathersjs websocket api?


I define a feathers service api as below:

class Monitor {

  find(_) {
    const metrics = prom.register.metrics();
    log.info(metrics);
    return new Promise((resolve) => {
      resolve({text: metrics});
    });
  }
}

function restFormatter(req, res) {
  res.format({
    'text/plain': function() {
      log('xxxx:', res);
      res.end(`The Message is: "${res.data}"`);
    }
  });
}

module.exports = function () {
  const app = this;

  // Initialize our service with any options it requires
  const service = new Monitor();
  app.configure(rest(restFormatter)).use('/metrics', service);

  // Get our initialize service to that we can bind hooks
  const monitorService = app.service('/metrics');

  // Set up our before hooks
  monitorService.before(hooks.before);

  // Set up our after hooks
  monitorService.after(hooks.after);
  return service;
};

module.exports.Monitor = Monitor;

when call this API from browser, I get below response:

"# HELP nodejs_gc_runs_total Count of total garbage collections.\n# TYPE nodejs_gc_runs_total counter\n\n# HELP nodejs_gc_pause_seconds_total Time spent in GC Pause in seconds.\n# TYPE nodejs_gc_pause_seconds_total counter\n\n# HELP nodejs_gc_reclaimed_bytes_total Total number of bytes reclaimed by GC.\n# TYPE nodejs_gc_reclaimed_bytes_total counter\n"

from above output you can see that feathersjs doesn't return the data in plain text format. It transpile my response text into a string. Below is the output from express service shown in the browser:

# HELP nodejs_gc_runs_total Count of total garbage collections.
# TYPE nodejs_gc_runs_total counter

# HELP nodejs_gc_pause_seconds_total Time spent in GC Pause in seconds.
# TYPE nodejs_gc_pause_seconds_total counter

# HELP nodejs_gc_reclaimed_bytes_total Total number of bytes reclaimed by GC.
# TYPE nodejs_gc_reclaimed_bytes_total counter

# HELP newConnection The number of requests served
# TYPE newConnection counter

this output is what I really want. How can I make them feathersjs service return above output?

Below is my feathersjs configuration part:

app
  .use(compress())
  .options('*', cors())
  .use(cors())
  .use('/', serveStatic(app.get('public')))
  .use(bodyParser.json())
  .use(bodyParser.urlencoded({extended: true}))
  .configure(hooks())
  .configure(rest())
  .configure(
    swagger({
      docsPath: '/docs',
      uiIndex: path.join(__dirname, '../public/docs.html'),
      info: {
        title: process.env.npm_package_fullName,
        description: process.env.npm_package_description
      }
    })
  )
  .configure(
    primus(
      {
        transformer: 'websockets',
        timeout: false
      },
      (primus) => {
        primus.library();
        primus.save(path.join(__dirname, '../public/dist/primus.js'));
      }
    )
  )
  .configure(services)
  .configure(middleware);

Solution

  • You are configuring feathers-rest twice which is why you still get the old output. Remove the app.configure(rest(restFormatter)) from your service file and then either change .configure(rest()) to .configure(rest(restFormatter)) in the main file to use the formatter to apply to all services or register a custom middleware for the service that does the formatting just for that service:

    app.use('/metrics', service, function(req, res) {
      res.format({
        'text/plain': function() {
          log('xxxx:', res);
          res.end(`The Message is: "${res.data}"`);
        }
      });
    });