app.post无法在node.js上多次运行

时间:2017-06-10 04:59:51

标签: javascript mysql node.js ejs

我正在使用MySQL的节点,快递,护照 我做了一个函数,它增加了2-3个表中几个字段的值。 使用按钮使用post方法调用该函数。

问题是它工作正常1次,然后第二次按下它发送此错误的按钮:

  

无法POST / nextad

我错过了什么?

这是我的.ejs文件:

<!DOCTYPE html>
<html>
<head>
	<title>viewads</title>
</head>
<body>
	<a href="/">Home Page</a>
    <a href="/logout">Logout</a>
	<form action="/nextad" method="post">
		<input type="submit" name="nextad" value="Next Ad">
	</form>
</body>
</html>

这是与帖子请求相对应的app.post:

app.post('/nextad',pointsDistrubute);

这是pointsDistribute函数:

function pointsDistrubute(req,res,next){
    var id = req.user.UserId;
    console.log('id is:'+ id);
    var points = req.user.UserPoints;
    points = points + 1;
    //adding points to user.
    console.log('Updated user points are:'+points);
    console.log("update user set UserPoints='"+points+"' where UserId = "+id)
    connection.query("update user set UserPoints='"+points+"' where UserId = "+id);

    //adding points to cause starts vv
    console.log(" select * from DonateTo where UserId = "+id);
    connection.query(" select * from DonateTo where UserId = "+id ,function(err,rows){
        // DonateTo Rows = rows
        console.log("Rows:"+rows);            
        var keys = Object.keys(rows);
        console.log("keys:"+keys);
        //extracting object from RowDataPacket rows and storing in row
        for (var i=0; i<1; i++) { 
            var row = rows[keys[i]] ;
            console.log(row);
            var key = Object.keys(row);
            console.log("key:"+ key);
                //extracting id and causeId[1-5] from Object row and assigning keys 'key' to them 
                for (var j=row[key[6]]; j<key.length;) { 
                    console.log("row[key[j]]:");
                    console.log(row[key[j]]);
                    //row[key[j]] gives value of Pointer
                    var cid = row[key[row[key[j]]]];
                    // cid is the cause id the pointer points to.
                    if(row[key[j]]!=null){
                        console.log("update Causes set CausePoints= CausePoints + 1 where CauseId = "+cid);
                        connection.query("update Causes set CausePoints= CausePoints + 1 where CauseId = "+cid);
                        //adding points to the selected cause

                        j++;
                        j=j%6;
                        if (j==0) j++;
                        rows[0].Pointer = j;
                        console.log("update DonateTo set Pointer = "+j+" where UserId = "+id);
                        connection.query("update DonateTo set Pointer = "+j+" where UserId = "+id);
                        // value of j will move from current pointer and keep incrementing. 

                        break;
                    }
                    // value of j will move from current pointer and keep incrementing.    
                    j++;
                    j=j%6;
                    if (j==0) j++;
                    rows[0].Pointer = j;
                    console.log("update DonateTo set Pointer = "+j+" where UserId = "+id);
                    connection.query("update DonateTo set Pointer = "+j+" where UserId = "+id);
                }
        }
    });
    next();
 }

P.S。 - 我真的认为你不需要阅读我的函数正文来理解为什么会出现这个问题。

1 个答案:

答案 0 :(得分:0)

相反,我认为阅读函数体以理解问题非常重要。毕竟,这是您提出POST请求时调用的函数。

我认为这里的问题是你在函数结束时使用next()

实际上next()将传递到与路由匹配的下一个中间件函数,因为this其他答案中已经很好地解释了它。但是,由于您没有在其他中间件中结束您的请求(或者因为没有其他中间件完全匹配此路由),您无法再次查询它,这就是您收到错误的原因。

基本上你可以将它改为:

res.json({
  status: 200,
  message: "Got a succesfull POST request and I can do another if I'd like"
})

此外,您应该注意处理函数中可能出现的错误,在这种情况下使用next是有意义的,例如:

var query = "SELECT * FROM DonateTo WHERE UserId = " + id
connection.query(query, function (err, rows) {
  if (err) return next(err)
  // here do your stuff
  res.end()
})