【问题标题】:How to Send a Response Using Seneca and Express如何使用 Seneca 和 Express 发送响应
【发布时间】:2016-07-07 20:12:29
【问题描述】:

我正在使用 Seneca 路由 API 调用并使用 express 来提供我的文件。 问题是在从 API 获取数据后,我似乎找不到将响应发送回客户端的方法。 使用 express,我只会使用 res.send,但由于我在 Seneca 上下文中,所以我不能。未在文档中找到有关此问题的任何参考。

"use strict"; 
const bodyParser  = require('body-parser');
const express = require('express');
const jsonp = require('jsonp-express');
const Promise = require('bluebird');
const path = require('path');
const seneca = require('seneca')();
const app = express();

module.exports = (function server( options ) {   

    seneca.add('role:api,cmd:getData', getData);

    seneca.act('role:web',{use:{
        prefix: '/api',
        pin: {role:'api',cmd:'*'},
        map:{
            getData: {GET:true}          // explicitly accepting GETs
        }
     }});

     app.use( seneca.export('web') )

     app.use(express.static(path.join(__dirname, '../../dist/js')))
     app.use(express.static(path.join(__dirname, '../../dist/public')))

     app.listen(3002, function () {
         console.log('listening on port 3002');
     });

    function getData(arg, done){
        //Getting data from somewhere....

        //Here I would like to send back a response to the client.            
     }
 }())    

【问题讨论】:

    标签: node.js express microservices


    【解决方案1】:

    看起来与“web”相关的功能现在已与单独的 express 适配器一起移动到模块“seneca-web”中。我得到了下面的修改版本。

    "use strict";
    
    const express = require('express');
    const app = express();
    const seneca = require('seneca')({ log: 'silent' });
    const web = require('seneca-web');
    
    let routes = [{
      prefix: '/api',
      pin: 'role:api,cmd:*',
      map: {
        getData: {
          GET: true
        }
      }
    }];
    
    let config = {
      context: app,
      routes: routes,
      adapter: require('seneca-web-adapter-express')
    };
    
    seneca.add('role:api,cmd:getData', getData);
    seneca.use(web, config);
    
    function getData(arg, done){
        done(null, {foo: 'bar'});
    }
    
    seneca.ready(() => {
      app.listen(3002, () => {
        console.log('listening on port 3002');
      });
    });
    

    【讨论】:

      【解决方案2】:

      根据senecajs documentation,您应该能够在您的getData 方法中调用done() 来返回/发送值/响应。考虑以下几点:

      在这里,我可以点击/api/getData 并收到{foo: 'bar'} 的响应。

      "use strict"; 
      const express = require('express');
      
      const seneca = require('seneca')();
      const app = express();
      
      seneca.add('role:api,cmd:getData', getData);
      
      seneca.act('role:web',{use:{
          prefix: '/api',
          pin: {role:'api',cmd:'*'},
          map:{
              getData: {GET:true}          // explicitly accepting GETs
          }
       }});
      
       app.use(seneca.export('web'));
      
       app.listen(3002, function () {
           console.log('listening on port 3002');
       });
      
      function getData(arg, done){
          done(null, {foo: 'bar'});         
      }
      

      【讨论】:

      • 有效!这比预期的要容易得多。
      • 嗨,为什么当我尝试运行你的这个脚本时,我得到一个错误,说“app.use() 需要中间件函数”?
      • 这里也一样,seneca 开始时会出现同样的错误
      猜你喜欢
      • 2017-12-24
      • 1970-01-01
      • 2017-11-16
      • 2019-03-10
      • 2020-02-08
      • 2020-03-17
      • 2019-05-05
      • 2012-01-13
      • 2020-06-09
      相关资源
      最近更新 更多