代码之家  ›  专栏  ›  技术社区  ›  Joey Yi Zhao

如何在feathersjs websocket api中响应纯文本?

  •  0
  • Joey Yi Zhao  · 技术社区  · 8 年前

    我将feathers服务api定义如下:

    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;
    

    "# 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"
    

    从上面的输出中,您可以看到feathersjs不会以纯文本格式返回数据。它将我的回复文本转换成字符串。以下是 express 浏览器中显示的服务:

    # 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
    

    这个输出是我真正想要的。我怎样才能让feathersjs服务返回到输出之上?

    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);
    
    1 回复  |  直到 8 年前
        1
  •  0
  •   Daff    8 年前

    您正在配置 feathers-rest 这就是为什么你仍然得到旧的输出。移除 app.configure(rest(restFormatter)) .configure(rest()) .configure(rest(restFormatter)) 在主文件中使用格式化程序应用于所有服务或注册 custom middleware for the service 这只会对该服务进行格式化:

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