2016-11-04 57 views
0

我遇到了seneca和seneca-web的麻煩。我真的是一個初學者。查詢,網址和身體參數沒有在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 product)。

到目前爲止的代碼工作,但我想獲得由id_of_the產品代表的id變量沒有做var id = req.args.params.id; 但我希望它合併在req對象中,我想做var id = req.id;

同樣在ADD處理程序中,我做了var args = req.args.body;但我希望看到正文在req對象中合併,正如我在David Gonzales的書 「開發node.js中的微服務」一書中看到的。

問題出現在處理程序中時,我想調用另一個通過產品ID的seneca動作。在這種情況下,ID可用於req對象,而不是在url參數中。 當然,我可以測試變量是否在req.args.params中定義,如果不使用req對象中的變量,但它不是一個乾淨的解決方案。

這是可能與當前版本的塞內卡和塞內卡網站?我已經從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.argsseneca-web遊戲的名字 - 這是要獲取這些信息的唯一途徑。

+0

謝謝!我錯過了這個角色:在seneca-web中的web部分。 –