如何从数据库中选择一堆行,如果不存在数据,则在数据库中创建该行,然后在JS中进行选择?

时间:2019-01-23 18:23:48

标签: javascript mysql node.js

下面的代码是我的节点服务器的代码。

要求: 每当api从客户端收到请求时,如果有记录,它都应该从数据库中选择数据。如果万一数据不存在,则应在数据库中插入一条新记录,然后将数据返回给客户端。

router.post('/api/getSelectedEmployeeInfoToUpdate', (req, res)=>{
  let obj = req.body;
  if (Object.keys(obj).length === 0) {
    res.status(400).send({'value':'invalid Parameters'});
  }
  const tempVal = '';

  obj.forEach(emp => {
      names += "'" + emp.name + "'" + ',';
  });

  let jsonArray=[];

  obj.forEach(emp=>{

      // Insert some dummy values
    var insertQueryString = `INSERT INTO rostertable_v2(name, month, year, day1, day2, day3, 
    day4, day5, day6, day7) VALUES ('${req.body.name}','${req.body.month}',${req.body.year},
    '${tempVal}','${tempVal}','${tempVal}',
    '${tempVal}','${tempVal}','${tempVal}')`;

    var sql_query = "SELECT * FROM `rostertable_v2`"
    +" WHERE `name` = '" + emp.name +"'"
    +" AND `month` = '" + emp.month +"'"
    +" AND `year` = " + emp.year;

    connection.query(sql_query, (error, rows, fields)=>{
      //callback
      if(!!error){
        console.log('Error in query...' + error);
        res.send({'success':0})
      }else{
        if (rows.length > 0) {
          console.log('/getEmployeeInfoToUpdate: Successfull query');
          // res.send(rows);
          jsonArray.push(rows);
          console.log(jsonArray);

        }else{
          //insert an empty record into the `rostertable`
          connection.query(insertQueryString, (error, result)=>{
            //callback
            if(!!error){
              console.log('Error in query...' + error);
              res.send([{'success':0}]);
            }else{
              if (result.affectedRows > 0) {
                connection.query(sql_query, (error, rows, fields)=>{
                  //callback
                  if(!!error){
                    console.log('Error in query...' + error);
                    res.send({'success':0})
                  } else {
                    // res.send(rows);
                    jsonArray.push(rows);
                  }
                });
              }
            }
          });
        }
      }
    });

  });// obj.forEach

  console.log('Json Array is : ' + jsonArray);
  res.send(jsonArray);
});

我的问题:我无法获得结果! 我使用let jsonArray=[];来推送查询结果。但是在我使用jsonArray将数据发送给用户时,它什么也没返回吗?

我不明白这是什么原因!

但是我jsonArray.push(rows)却以下面的方式存储数据

[ [ RowDataPacket {
  name: 'Andy',
  month: '0',
  year: 2019} ]]`

如何解决此问题

非常感谢任何帮助

1 个答案:

答案 0 :(得分:0)

一旦推送数组,然后发送res。

jsonArray.push(rows);

//Now send res
res.send(jsonArray);

在您的情况下,您已在将数据填充到数组中之前写了res.send。并且由于节点的async性质,我们不必等待将数据填充到数组中。