快速路由从post发送到next next不是自动的

时间:2016-03-07 11:48:49

标签: node.js express

我定义了以下路线:

router.post('/select', function(req, res, next){ var sql = "SELECT metadocid, col1, col2, col3 FROM mdt1 where "; var metadocid = req.body.metadocid; var op1 = req.body.op1;

if (metadocid !== "") { var opm = req.body.op1; switch (opm){ case "equals": opm = "="; break; } var sel1 = "metadocid " + opm + " " + metadocid; } sql = sql + sel1; console. log('Send sql: ' + sql ); async.waterfall( [ function(callback) { fs.writeFile('message.txt', sql, callback); } ], function (err) { if(err) return console.log(err); console.log('Appended text!'); });
next(); });
router.get('/documents', function(req,res){ handleAllDepartments(1); res.sendFile(__dirname + '/docs.html'); }); app.use('/',router);

但是从router.post(' / select')它没有启动router.get(' / documents')。如果我在浏览器中输入路线/文件 该程序继续运行。 我希望程序自动从router.post(' / select')继续到router.get(' / documents')。

请帮忙!

提前谢谢!

2 个答案:

答案 0 :(得分:0)

Express中的路由点​​是,如果你打电话,例如POST /select,路由器将仅调用分配给此功能的功能,并且仅调用此请求。这意味着next()的使用不会将执行传递给例如GET /selectPOST /documentsGET /documents,因为这些请求不同。

在Express中有一个名为use的方法,可以让您在不关心方法和地址的情况下捕获每个请求。它当然也允许使用next()。

总而言之,您必须为评论中描述的每一个(这很多)调用4个单独的请求,或者只是发出一个请求来处理您将要在4个路由器中执行的所有操作。

答案 1 :(得分:0)

我从你的代码中不清楚为什么你这样做。您似乎正在尝试将某些数据发布到文件中,然后将单独的文档发送到客户端。这是一个稍微不常见的工作流程,但肯定是可行的。

在像REST这样的RESTful架构中处理POST的更常见的方法是在一个处理程序中执行POST,并通过重定向到新POST的资源进行响应,然后客户端将使用GET单独请求

也就是说,如果您确实有一个工作流程,您首先发布一些数据,然后想要调用其他函数来处理响应,那么您可以在路由上使用多个处理程序,如下所示:

function receiveDocData(req,res,next){
  var sql = "SELECT metadocid, col1, col2, col3 FROM mdt1 where ";
    var metadocid = req.body.metadocid;
    var op1 = req.body.op1;

  if (metadocid !== "") {
        var opm = req.body.op1;
        switch (opm){
               case "equals":
                   opm = "=";
                   break;
               }
        var sel1 = "metadocid "  + opm + " " + metadocid;
    }
    sql = sql + sel1;
    console. log('Send sql: ' + sql );
    async.waterfall(
    [
      function(callback) {
       fs.writeFile('message.txt', sql, callback);
      }
    ], function (err) {
        if(err) return console.log(err);
        console.log('Appended text!');
    });

    next();
  }
}

function doTheNextThing(req,res){
  handleAllDepartments(1);
  res.sendFile(__dirname + '/docs.html');
}


router.post('/select', receiveDocData, doTheNextThing);
router.get('/documents', doTheNextThing);
app.use('/',router);

请注意,我离开了' / documents'根据您的设置假设您希望让它独立于原始' / select'中的操作。处理程序。