在expressjs中简单函数中的未处理的注意事项

时间:2016-12-03 10:12:20

标签: javascript node.js express

这是我的功能:

/* function for add transaction */
function addtransaction(user_id,status,amount,date,description){
  var saved = "";
  function getLastId(){
    Transactions.findOne({}, {}, { sort: { '_id' : -1 } }).lean().exec(function(err, lastTrans) {
        if (err) {
          return 1;
        }else{
          return parseInt(lastTrans.id) + 1;
        }
    });  
  }

  var newId = getLastId();
  var newTransactions = new Transactions({
      id           : newId,
      user_id      : user_id ,
      status       : status ,
      amount       : amount ,
      date         : date ,
      description  : description
  });

  if (newTransactions.save()){
    return true;
  }else{
    return false;
  }     
}/* end function */

这是我的控制台错误:

你能帮我解决这个错误吗? enter image description here

我更新了我的功能,但仍然有错误!

3 个答案:

答案 0 :(得分:0)

似乎错误在这里getLastId + 1getLastId是一个函数,1是一个数字,函数不能转换为数字。很可能你忘了把括号放在函数调用之外。

尝试使用getLastId + 1

替换getLastId() + 1

答案 1 :(得分:0)

您可能错过了以下的():

id: getLastId + 1

答案 2 :(得分:0)

您的问题是,您不是在等待getLastId()实际返回,因为它是异步的。由于它是异步的,而getLastId()仍然有效,因此您的代码已经开始创建新的Transaction,其中newIdundefined,因为没有返回任何内容。因此,您需要将依赖于newId的代码放入Transaction.findOne()的回调中,或者将回调传递给getLastId()

请注意,您的addtransaction函数也应该采用回调函数,因此您可以以异步方式将newTransactions.save()的结果返回给被调用者。我没有在下面的代码示例中执行此操作,因为我不知道您的其他代码是如何构建的。

我还会说下面的方法#1是更好的方法,因为它的代码较少,每次getLastId()被调用时都不涉及定义addtransaction(),并且它的回调少于方法#2。

方法#1,将逻辑放在Transactions.findOne()

function addtransaction(user_id, status, amount, date, description) {
  Transactions.findOne({}, {}, { sort: { '_id' : -1 } }).lean().exec(function(err, lastTrans) {
    var newId = err ? 1 : (parseInt(lastTrans.id) + 1);
    var newTransactions = new Transactions({
      id           : newId,
      user_id      : user_id ,
      status       : status ,
      amount       : amount ,
      date         : date ,
      description  : description
    });

    return newTransactions.save();
  }); 
}

方法#2,传入回叫

/* function for add transaction */
function addtransaction(user_id,status,amount,date,description){
  var saved = "";
  function getLastId(callback){
    Transactions.findOne({}, {}, { sort: { '_id' : -1 } }).lean().exec(function(err, lastTrans) {
        if (err) {
          return callback(null, 1);
        } else {
          return callback(null, parseInt(lastTrans.id) + 1);
        }
    });  
  }

  getLastId((err, newId) => {
    var newTransactions = new Transactions({
        id           : newId,
        user_id      : user_id ,
        status       : status ,
        amount       : amount ,
        date         : date ,
        description  : description
    });

    return newTransactions.save();
  });

}/* end function */

还值得注意的是,直接从异步函数分配返回数据不是在Node.js中构造异步函数的正确方法。 See this answer用于构造这些类型函数的正确方法。