NodeJS и Express - функция экспорта пропускает запрос к базе данных SQLite3 - PullRequest
0 голосов
/ 06 декабря 2018

Попытка связать функцию в отдельном файле JS с моим индексом, но часть функции пропускается, возвращается к методу index.js app.post и, наконец, возвращается к запросу db, который пропускается вдругой файл JS.

sales.js =

const sqlite3 = require('sqlite3').verbose()

const db = new sqlite3.Database('./database/stock.db', (err) => {
    if (err) return console.error(err.message)
    console.log('Connected to the "stock.db" SQlite database.')
})

module.exports = {

sale: function(formData, cartlist) {
    const item = parseInt(formData, 10)
    console.log(item)
    const sql = "SELECT name, price FROM products WHERE barcode_id = " + item + ";"
    console.log(sql)
    console.log("test1")
    db.all(sql, (err, data) => {
        if(err) console.error(err.message)
        console.log("test2")
        cartlist = cartlist.concat(data)
        console.log(cartlist)
    })
    console.log("test3")
    return cartlist
}
}

index.js (соответствующие части) =

const sales = require('./sale.js')

.,,.

var cartlist = []

app.post('/sales', async(req, res) => {
    const formData = String(req.body.Barcode)
    cartlist = await sales.sale(formData, cartlist)
    console.log(cartlist)
    res.render('cart', {purchases: cartlist})
})

.,.

У меня есть тесты, чтобы показать порядок, и test1 сначала регистрируется, затем test3, а затем возвращается к test2, показывая, что он выпрыгивает, а затем возвращается снова.Не знаком с SO форматированием или Node.js, поэтому заранее извиняюсь.Я предполагаю, что это несколько связано с функциями обратного вызова, но мне еще предстоит полностью понять, как они работают.

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

Я считаю, db.all - это метод async, поэтому вам нужно await метод, если вы хотите приостановить выполнение.Попробуйте это:

await db.all(sql, (err, data) => {
    if(err) console.error(err.message)
    console.log("test2")
    cartlist = cartlist.concat(data)
    console.log(cartlist)
})
0 голосов
/ 06 декабря 2018

Вы возвращаете пустой массив в функции sale.Вы должны понимать асинхронную природу JS и как работает цикл обработки событий.

Чтобы заставить ваш кусок кода работать, вы обычно используете асинхронное / обещание:

sale = function(formData, cartlist) {
    return new Promise((resolve) => {
      const item = parseInt(formData, 10)
      const sql = 'SELECT name, price FROM products WHERE barcode_id = ' + item + ';'
      db.all(sql, (err, data) => {
        if (err) console.error(err.message)
        console.log('test2')
        cartlist = cartlist.concat(data)
        resolve(cartlist)
      })
    })
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...