-1

当将数据从 jquery 发布到 node.js 进程时,有时它会工作,有时它不会。这取决于我如何构建代码。这样它的工作原理:

http.createServer(router).listen(5000, '127.0.0.1');
console.log('Server running at http://127.0.0.1:5000/');

function router(req, res){
    var page = url.parse(req.url, true);

        switch(page.pathname){
            case '/new-task': tasks.postNewTask(req, res); break;
        }

}

“任务”是我加载的一个模块。里面有postNewTask:

function postNewTask(req, res){
    core.postRequest(req, res, function () {
    // lots of stuff inside
    })
}

postRequest 是我从 Stackoverflow “借来”的一个函数。它定义为:

function postRequest(request, response, callback) {
    var queryData = "";
    if(typeof callback !== 'function') return null;

if(request.method == 'POST') {
    console.log("it's post");
    request.on('data', function(data) {
        console.log("it's data");
        queryData += data;
        if(queryData.length > 1e6) {
            console("too much stuff");
            queryData = "";
            response.writeHead(413, {'Content-Type': 'text/plain'});
            request.connection.destroy();
        }
    });

    request.on('end', function() {
        console.log("it's end");
        response.post = querystring.parse(queryData);
        callback();
    });

} else {
    console.log("no post");
    response.writeHead(405, {'Content-Type': 'text/plain'});
    response.end();
}
}

这完美运行,并且 tasks.postNewTask 中的代码运行。但是,当我将路由器更改为此:

function router(req, res){
 var page = url.parse(req.url, true);

 var session = core.getCookies(req).s;    
if (page.pathname == '/login') {    

core.postLogin(req, res); return; }



 database.query('SELECT * from Members WHERE Session = ?;', [session], function(err, rows, fields) {

     if (err) throw err;
     if (rows.length>0) {

         switch(page.pathname){
             case '/new-task': tasks.postNewTask(req, res); break;
         }

     } else {
         res.writeHead(200, "OK", {'Content-Type': 'application/json'});
         res.end(JSON.stringify('login'));
     };
 });

 }

然后 postRequest 不再起作用。它只会打印“它的帖子”,就是这样。它从不打印数据或到达末尾。当我在浏览器上超时时,它似乎也永远不会返回客户端。

这里的问题是 postRequest 中的“数据”和“结束”事件永远不会被调用,而我唯一改变的是将数据库调用包装在 switch 语句周围。

谢谢!

4

1 回答 1

0

您在 postRequest 中有 3 个控制台输出

it's post
it's data
it's end

第一个被触发,因为 if 条件只检查请求类型,其余两个在请求获取数据和结束信号时异步完成。因此,如果 postNewTask 返回或发送对请求的响应,则它可能无法到达该部分。检查你在做什么// lots of stuff inside

同样在搜索你的 mysql 文档https://npmjs.org/package/mysql时,我发现:

You MUST NOT provide a callback to the query() method when streaming rows.

所以也检查一下。

于 2013-02-08T21:17:33.703 回答