MySQL 回调和范围

标签 mysql json node.js api express

我在使用 node-mysql 使用 express 构建 Web API 时遇到问题。我有以下文件 ./lib/handlers/list.js,该文件已加载并且一切正常(使用 require('./lib/handlers/list.js')(app)) :

var error= function(res){
  res.json([]);
}

var send_lists = function(res,lists){
    res.json(lists);
}

var add_tasks_to_lists = function(res,lists){
    for (var i = 0, list; i < lists.length, list=lists[i]; i++) {
        var connect=require('../../mysql.js').connection();
            connect.connect();
            connect.query("SELECT * FROM `www`.`teamli_tasks` WHERE `list_id`="+connect.escape(list['id'])+";",function(_err,_rows){
              if(!_err && _rows && _rows.length){
                var tasks=[];
                for(var j=0, _row; j < _rows.length, _row=_rows[j], _row!=null; j++){
                  var task={};
                  task['id']=_row.id;
                  task['text']=_row.text;
                  task['completed']=_row.completion?true:false;
                  tasks.push(task);
                }
                list['tasks']=tasks;
              }
            });
    }
    send_lists(res,lists);
}

module.exports = function(app){
  app.post('/api/list',function(req,res){
    console.log(req.session);
    if(req.hasOwnProperty("body") && req.body && req.hasOwnProperty("session") && req.session && req.session.hasOwnProperty("user") && req.session.user && req.session.user.hasOwnProperty("id") && req.session.user.id){
      var connection=require('../../mysql.js').connection();
      connection.connect();
      connection.query("SELECT * FROM `www`.`teamli_lists` WHERE `owner_id`="+connection.escape(req.session.user.id)+";",function(err, rows){
        if(!err && rows && rows.length){
          var lists=[];
          for (var i = 0, row; i < rows.length, row=rows[i]; i++) {
            console.log("Getting list with ID: "+row.id);
            var list={};
            list['participants']=req.session.user.username;
            list['timeenforcer']=null;
            list['id']=row.id;
            list['date']=1382659200;
            list['duedate']=null;
            list['title']=row.name;
            list['color']=row.color;
            console.log(list);
            lists.push(list);
          }
        add_tasks_to_lists(res,lists);
        }else error(res);
      });
    }else error(res);
  });
}

但是,当点击此 API 端点 (/api/list) 时,我收到此错误:

TypeError: Cannot set property 'tasks' of undefined
    at Query._callback (/var/www/main/www/lib/handlers/api/list.js:24:27)

require('../../mysql.js').connection() 生成一个新的 node-mysql 连接对象,使用中提供的凭据进行设置mysql.js。 teamli_lists 和 teamli_tasks 中都有相关数据,通过 id/list_id 连接。

我对 Node 有点陌生,尤其是像这样的异步东西,所以任何帮助都是值得赞赏的。如果您需要更多信息,请告诉我。谢谢!

最佳答案

该错误表明属性“tasks”正在 undefined variable 上使用。您尝试设置“任务”属性的位置位于此处:

list['tasks']=tasks;

但是在 for 循环中声明时,您的列表永远不会被初始化。尝试 list = {};(空对象)

关于MySQL 回调和范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20736843/

相关文章:

javascript - Jquery 解析来自 html 元素的 JSON

MySQL - 引用上一行以添加计算列

mysql - iOS - 将从 mySQL 服务器接收到的日期转换为用户本地时间

mysql - 将 Google App Engine 数据存储导出到 MySQL?

node.js - 当win.show();时, Electron 会不断被选择。

node.js - NodeJS Express 和 Mongoose : How to get data from array not in one but in multi table columns

javascript - node.js - 使结果全局可用(请求模块)

java - Hibernate 连接表

java - 使用图形 API 获取用户相册中的照片的链接是什么?

java - 如何从异步任务中的 JSON 查询返回多个字符串?