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

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


  无法发布/ 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();
 }


附言-我真的不认为您需要阅读我的函数正文以了解为什么会出现此问题。

最佳答案

相反,我认为阅读函数的主体以理解问题很重要。毕竟,这是您发出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()
})

10-07 19:15
查看更多