【问题标题】:Node js returning values from function节点js从函数返回值
【发布时间】:2019-03-06 01:51:51
【问题描述】:

我生活在 PHP 世界中,但我正在尝试使用 Node 构建一个 REST Api。

我整天都在尝试从 for 循环返回一组结果。基本上我正在传递一个field_name:field_value 的数组。我想将更新的结果推送到一个数组中返回。我可以让它登录控制台,但不能再进一步了。

这是一个示例 post json 数据

{
    "first_name":"Jeff",
    "phone":"4855555555"
}

这是函数和循环

function UpdateKey(user_id, key, value, cb) {
    connection.query('UPDATE users SET ' + key + ' = ? WHERE id = ? LIMIT 1', [value, user_id], function(err, results) {
    if (err) {
        callback = key + " update failed.";
    } else {
        callback = key + " was updated.";
    }
    cb(callback);

  });
}    

for (myKey in post_data) {
  UpdateKey(user_id, myKey, post_data[myKey], function(id) {
    console.log(id);
  });
}

res.send(JSON.stringify({ "status": 200, "error": "", "response": my_results_here }));

我一直在研究异步,但不确定这里的最佳路线。任何帮助都会很棒!

【问题讨论】:

标签: javascript mysql node.js node-modules


【解决方案1】:

您想要的解决方案:

const updateUserField = (userId, field, value) => {
  return Promise((resolve) => {
    const query = 'UPDATE users SET ' + field + ' = ? WHERE id = ?';
    const data = [value, userId];
    connection.query(query, data, (error) => {
      if (error) return resolve(field + ' update failed');
      resolve(field + ' was updated');
    });
  });
};


router.post('/user/:id', async (req, res) => {
    const userId = req.params.id;
    const data = req.body;

    const response = [];
    for (const field in data) {
      response.push(
        await updateUserField(userId, field, data[field])
      );
    }

    res.status(200).send({
      response
    });
});


或并行:

router.post('/user/:id', async (req, res) => {
    const userId = req.params.id;
    const data = req.body;

    const response = await Promise.all(
      Object
        .keys(data)
        .map(field => updateUserField(userId, field, data[field]))
    );

    res.status(200).send({
      response
    });
});



正确的解决方案

据我了解,您想在用户表中获取发布数据和更新记录。

那么为什么不在一个查询中完成呢?

试试这个方法:

const updateUser = (userId, data) => {
  return Promise((resolve, reject) => {
    const query = 'UPDATE users SET ? WHERE id = ?';
    connection.query(query, [data, userId], (error) => {
      if (error) return reject(error);
      resolve();
    });
  });
};

router.post('/user/:id', async (req, res) => {
  try {
    const userId = req.params.id;
    const data = req.body;
    await updateUser(userId, data);
    res.status(200).send({
      message: 'User account successfully updated'
    })
  }
  catch (error) {
    console.error(error);
    res.status(500).send({
      message: 'Failed update user account'
    });
  }
});



但最好考虑使用 ORM,即Sequelize 来实现安全、验证等功能,从而简化开发人员的工作。

【讨论】:

    【解决方案2】:

    您可以将所有结果收集到一个数组中,并在数组大小等于键大小时发送:

    const keys = Object.keys(post_data);
    const response = [];
    
    for(const myKey of keys) {
      UpdateKey(user_id, myKey, post_data[myKey], function(id) {
        response.push(id);
        if(keys.length === response.length) {
          res.send(JSON.stringify({ 
           status: 200, 
           error: "", 
           response
          }));
        }
      });
    }
    

    【讨论】:

    • 太棒了,这行得通!希望我在 8 小时前问过这个问题!谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-04
    • 1970-01-01
    • 1970-01-01
    • 2018-07-15
    • 2017-03-20
    • 2019-11-12
    • 1970-01-01
    相关资源
    最近更新 更多