2016-11-04 11 views
0

У меня проблемы с seneca и seneca-web. Я действительно новичок.Параметры запроса, url и body не слиты правильно в seneca с seneca-web

Это мой код до сих пор:

"use strict"; 

var express = require('express'); 
var Web = require("seneca-web"); 
var bodyParser = require('body-parser') 

var plugin = require('./products_actions/products_actions'); 

module.exports = plugin; 

var entities = require('seneca-entity') 
var seneca = require('seneca')(); 

seneca.use(plugin); 
seneca.use(entities); 

seneca.use('mysql-store', { 
    name : 'ecrm', 
    host : 'localhost', 
    user : 'root', 
    password : 'ecrm', 
    port : 3306 
}) 

seneca.ready(function(err) { 


    var Routes = [ { 
     pin : 'area:product,action:fetch,criteria:*', 

     prefix : '/products/fetch', 

     map : { 
      byId : { 
       GET : true, 
       suffix : "/:id" 
      } 
     } 

    }, { 
     pin : 'area:product,action:*', 

     prefix : '/products', 

     map : { 
      fetch : { 
       GET : true 
      }, 

      add : { 
       GET : false, 
       PUT : true 
      } 
     } 

    } ]; 

    var app = express(); 
    app.use(bodyParser.json()); 

    var config = { 
     routes : Routes, 
     adapter : require('seneca-web-adapter-express'), 
     context : app, 
     options : { 
      parseBody : false 
     } 
    } 

    seneca.use(Web, config); 

    app.listen(3000); 
}); 

и вот код, в котором определены Сенека действия:

module.exports = function(options) { 
var seneca = this; 

// ADD 
seneca.add({ 
    area : "product", 
    action : "add" 
}, function(req, done) { 
    var products = this.make$("prodotti"); 

    var args = req.args.body; 

    console.log(args); 

    products.nome = args.nome; 
    products.categoria = args.categoria; 
    products.descrizione = args.descrizione; 
    products.prezzo = args.prezzo; 

    products.save$(function(err, product) { 
     done(err, products.data$(false)); 
    }); 
}); 



// get by Id , PROBLEM!!! 
seneca.add({ 
    area : "product", 
    action : "fetch", 
    criteria : "byId" 
}, function(req, done) { 
    console.log("HERE"); 

    var id = req.args.params.id; 

    var product = this.make("prodotti"); 
    product.load$(id, done); 
}); 

// LIST ALL 
seneca.add({ 
    area : "product", 
    action : "fetch" 
}, function(args, done) { 
    var products = this.make("prodotti"); 
    products.list$({}, done); 
}); 


} 

Проблема заключается в обработчике GetByID (маршрут/продукты/извлечения/byId/id_of_the продукта).

Код пока работает, но я хочу получить переменную id, представленную id_of_the продуктом, не выполняющим var id = req.args.params.id; , но я хочу, чтобы он был объединен в объект req, и я хотел бы сделать var id = req.id;

То же самое в обработчике ADD, я сделал var args = req.args.body; но я хотел бы, чтобы тело слилось в объект req, как я видел в книге «Разработка микросервисов в node.js» Дэвида Гонзалеса.

Проблема возникает, когда в обработчике я хочу вызвать другое действие seneca, передающее идентификатор продукта. В этом случае идентификатор доступен для объекта req, а не в параметрах url. Конечно, я мог бы проверить, определена ли переменная в req.args.params, и если она не используется с объектом req, но это не чистое решение.

Возможно ли это с текущей версией seneca и seneca web? Я установил их из npm, и у меня есть следующие версии: seneca 3.2.2 и seneca-web 2.0.0;

Заранее благодарен!

ответ

0

Вы должны собрать информацию, которая вас интересует, проверить ее достоверность и вызвать основное действие только с этой информацией. role:web может быть хорошим привратником для общих проверок здравомыслия от пользовательского ввода до того, как вы нажмете свои фактические услуги.

Помните, что пользователь может передать что-либо в качестве параметра маршрута, тела, запроса и т. Д., Необходимо позаботиться о том, чтобы санировать информацию, предоставленную пользователем, и отправлять только действительные данные в основные действия.

seneca.add('role:web,domain:product,action:getById', function (msg, done) { 
    const id = parseInt(msg.args.params.id, 10) 
    if (isNaN(id)) { 
    return done(new Error('needs to be numeric')) 
    } 
    seneca.act('role:entity,domain:product,action:getById', {id}, done) 
}) 

seneca.add('role:entity,domain:product,action:getById', function (msg, done) { 
    this.make$('product').load$(msg.id, done) 
}) 

Получение информации о запросе из (в примере выше) msg.args это название игры в seneca-web - это единственный способ получить в этой информации.

+0

Спасибо! Мне не хватало роли: веб-часть в seneca-web. –