Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在同一个express函数(mysql)中将项目添加到两个表中_Javascript_Node.js_Express - Fatal编程技术网

Javascript 如何在同一个express函数(mysql)中将项目添加到两个表中

Javascript 如何在同一个express函数(mysql)中将项目添加到两个表中,javascript,node.js,express,Javascript,Node.js,Express,我正在为虚拟商店创建购物车,当按下“提交”按钮时,我需要将订单插入“订单”表,并将项目插入“订单项目”表 我一直在使用express在每个函数中只在一个表中插入内容,但现在我需要将两者放在同一个表中。。。我试着用期票 这是我的html: 产品名称 价格 量 {{product.name} {{产品.价格|货币} 弗雷特:{票价|货币} 总计:{{Total | currency} 提交购物车 这是我调用的函数: registerTransaction(){ const

我正在为虚拟商店创建购物车,当按下“提交”按钮时,我需要将订单插入“订单”表,并将项目插入“订单项目”表

我一直在使用express在每个函数中只在一个表中插入内容,但现在我需要将两者放在同一个表中。。。我试着用期票

这是我的html:


产品名称
价格
量
{{product.name}
{{产品.价格|货币}
弗雷特:{票价|货币}
总计:{{Total | currency}
提交购物车
这是我调用的函数:

registerTransaction(){
            const date = new Date()
            const dateTime = {
                day: date.getUTCDate(),
                month: date.getUTCMonth(),
                year: date.getUTCFullYear(),
                hour: date.getUTCHours() - 3,
                minute: date.getUTCMinutes(),
                sec: date.getUTCSeconds()
            }
            const transaction = {
                date: new Date(`${dateTime.year}-${dateTime.month}-${dateTime.day}T${dateTime.hour}:${dateTime.minute}:${dateTime.sec}Z`)
            }
            transaction.userid = 1
            transaction.fare = parseFloat(this.fare)
            transaction.total = parseFloat(this.total)
            transaction.cart = this.cart


            axios.post(`${baseApiUrl}/checkout`, transaction)
                .then(() => this.$toasted.global.defaultSuccess())
                .catch(showError)
        }
这是我的axios后端:

const save = (req, res) =>{
        const transaction = {...req.body}

        try{
            existsOrError(transaction.date, "Error: transaction date is invalid")
            existsOrError(transaction.userid, "Error in the user authentication")
            //existsOrError(transaction.fare, "Error in calculating the fare")
            existsOrError(transaction.total, "Error in the total value")
        }
        catch(msg){
            return res.status(400).send(msg)
        }

        app.db('orders')
            .insert(transaction)
            .then(console.log('feito!'))
            .then(saveProducts(transaction))
            .catch(err => res.status(500).send(err))



    }

    const saveProducts = (transaction) => {
        const orderId = app.db(`orders`).select(`idOrder`) .where({idClient: transaction.userid}).last()
        console.log('Done')
        for(let i = 0; i < transaction.cart.length; i++){
            quantity = app.db('products').select('quantity').where({id: transaction.cart[i].id}).first()
            quantity -= transaction.cart[i].quantity
            app.db('products').update(quantity).where({id: transaction.cart[i].id})
            const orderedProduct = {idOrder: parseInt(orderId), idProduct: parseInt(transaction.cart[i].id), quantity: parseInt(transaction.cart[i].quantity)}
            app.db('orderedproducts').insert(orderedProduct).then(console.log('produto inserido')).catch(err => res.status(500).send(err))
        }
        return
    }
const save=(请求、恢复)=>{
const事务={…req.body}
试一试{
ExistorError(transaction.date,“错误:交易日期无效”)
existsOrError(transaction.userid,“用户身份验证中的错误”)
//ExistorError(transaction.fare,“计算票价时出错”)
existsOrError(transaction.total,“总值中的错误”)
}
捕获(味精){
返回res.status(400).发送(msg)
}
app.db(“订单”)
.插入(交易)
.then(console.log('feito!'))
.然后(储蓄产品(交易))
.catch(err=>res.status(500).send(err))
}
const saveProducts=(事务)=>{
const orderId=app.db(`orders`)。选择(`idOrder`)。其中({idClient:transaction.userid})。last()
console.log('Done')
for(设i=0;ires.status(500)。send(err))
}
回来
}

我希望它先保存我的订单,调用saveProducts函数保存订单中的产品,然后返回,但它返回了一个错误,好像不允许这样做…

我查看了文档,发现了以下内容,这基本上意味着查询方法有一个promise接口,这意味着我们可以附加
然后
和catch方法。这也意味着我们可以对其使用
async/await

knex.select('*')
  .from('users')
  .where({name: 'Tim'})
  .then(function(rows) {
    return knex.insert({user_id: rows[0].id, name: 'Test'}, 'id').into('accounts');
  })
  .then(function(id) {
    console.log('Inserted Account ' + id);
  })
  .catch(function(error) { console.error(error); });
对于您的代码,我添加了
async/await
,如果您愿意,可以使用
然后
方法

const save = (req, res) => {
  const transaction = { ...req.body };

  try {
    existsOrError(transaction.date, "Error: transaction date is invalid");
    existsOrError(transaction.userid, "Error in the user authentication");
    //existsOrError(transaction.fare, "Error in calculating the fare")
    existsOrError(transaction.total, "Error in the total value");
  } catch (msg) {
    return res.status(400).send(msg);
  }

  try {
    let orderId = await app
      .db("orders")
      .insert(transaction);
    console.log('order inserted :' + orderId);

    await saveProducts(transaction);
    console.log("saved all the products");
  } catch(err) {
    console.log(err);
  }
};

const saveProducts = async transaction => {
  const orderId = await app
    .db(`orders`)
    .select(`idOrder`)
    .where({ idClient: transaction.userid })
    .last();
  console.log("orderId : " + orderId);
  let quantity;
  for (let i = 0; i < transaction.cart.length; i++) {
    quantity = await app
      .db("products")
      .select("quantity")
      .where({ id: transaction.cart[i].id })
      .first();
    quantity -= transaction.cart[i].quantity;
    await app
      .db("products")
      .update(quantity)
      .where({ id: transaction.cart[i].id });
    const orderedProduct = {
      idOrder: parseInt(orderId),
      idProduct: parseInt(transaction.cart[i].id),
      quantity: parseInt(transaction.cart[i].quantity)
    };
    let insertedId = await app
      .db("orderedproducts")
      .insert(orderedProduct)
      .catch(err => res.status(500).send(err));
    console.log("inserted ordered product");
  }
  return;
};
const save=(请求、恢复)=>{
const transaction={…req.body};
试一试{
ExistorError(transaction.date,“错误:交易日期无效”);
existsOrError(transaction.userid,“用户身份验证中的错误”);
//ExistorError(transaction.fare,“计算票价时出错”)
existsOrError(transaction.total,“总值中的错误”);
}捕获(味精){
返回res.status(400)。发送(msg);
}
试一试{
让orderId=等待应用程序
.db(“订单”)
.插入(交易);
log('插入的订单:'+订单ID);
等待保存产品(交易);
console.log(“保存了所有产品”);
}捕捉(错误){
控制台日志(err);
}
};
const saveProducts=异步事务=>{
const orderId=等待应用程序
.db(`orders`)
.select(`idOrder`)
.where({idClient:transaction.userid})
.last();
log(“orderId:+orderId”);
让数量;
for(设i=0;ires.status(500).send(err));
console.log(“插入的订购产品”);
}
回来
};
注意:我没有执行代码,所以我不能保证它会执行 按照你想要的方式工作,但我相信这会给你一个机会 如何前进的想法


错误是什么?它会遍历所有代码,不会更改数据库中的寄存器,并返回“[object]”作为错误消息我发现了其中一个问题!这是datetime格式,我刚刚更改:date:new date(${datetime.year}-${datetime.month}-${datetime.day}T${datetime.hour}:${datetime.minute}:${datetime.sec}Z)到:date:${datetime.year}-${datetime.datetime.date}${datetime.hour}:${datetime.minute,如果有人可以帮助…
app.db(
orders
)。选择(
idOrder
)。其中({idClient:transaction.userid})。last()console.log('Done')
)是ORM方法还是什么?如果是,您使用的是哪种ORM,并且我认为如果是异步调用,那么您可能需要调用wait,或者如果您使用的是promise,那么它将必须添加然后回调。我没有使用ORM方法。。。我将尝试使用async await,并在此处发布结果:)