将数据从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;
}
}
“tasks”是我加载的模块。里面有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中的“data”和“end”事件从不被调用,而我改变的唯一事情就是围绕switch语句包装数据库调用。
谢谢!
答案 0 :(得分: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.
所以也要检查一下。