GET вызов с базой данных - PullRequest
0 голосов
/ 26 мая 2020

Я хочу создать NodeJS -программу, которая обслуживает JSON -арай из базы данных. Я использую пакеты express, sqlite и sqlite3. Когда я запускаю код в терминале, я получаю следующий результат:

$ node index.js
[
  { Field1: 'Stockholm', Field2: '123' },
  { Field1: 'Gothenburg', Field2: '123' },
  { Field1: 'London', Field2: '123' }
]

Он отображает правильные данные.

Это мой код:

const express = require('express')
const sqlite = require('sqlite')
const sqlite3 = require('sqlite3')

const app = express()

let database

sqlite
  .open({ driver: sqlite3.Database, filename: 'test.sqlite' })
  .then((database) => {
    database.all('SELECT * FROM cities').then(rows => {
        console.log(rows)      
      })
  })

  app.get('/', (request, response) => {
    database.all('SELECT * FROM cities').then(cities => {
      response.send(cities)
    })
  })

  app.listen(3000)

Когда я запускаю приведенный выше код, на http://localhost:3000 я получаю сообщение об ошибке: TypeError: Cannot read property 'all' of undefined

Я хочу отображать те же данные, что и в терминале / консоли на http://localhost:3000

Что не так с моим кодом?

Ответы [ 2 ]

0 голосов
/ 26 мая 2020

База данных будет инициализирована асинхронным c способом, поэтому вам следует подождать, пока у вас будет экземпляр базы данных, и сохранить его.

const express = require('express')
const sqlite = require('sqlite')
const sqlite3 = require('sqlite3')

const app = express()

let globalDatabase

sqlite
  .open({ driver: sqlite3.Database, filename: 'test.sqlite' })
  .then((database) => {
    if(database){
      database.all('SELECT * FROM cities').then(rows => {
        console.log(rows)      
      })
      globalDatabase = database
    }

  })

  app.get('/', (request, response) => {
    if(globalDatabase) {
      globalDatabase.all('SELECT * FROM cities').then(cities => {
        response.send(cities)
      })
    }else{
       // todo whatever you want send error, or wait for db or initialize it again
    }

  })

  app.listen(3000)
0 голосов
/ 26 мая 2020

Похоже, что ваш database приближается к неопределенному, поскольку вы используете его в обещании, но не назначаете его. Вы можете решить вашу проблему следующим образом:

let database

sqlite
  .open({ driver: sqlite3.Database, filename: 'test.sqlite' })
  .then((db) => {
    // assign it here
    database = db;
    database.all('SELECT * FROM cities').then(rows => {
       console.log(rows)      
    })
  })

Тогда вы сможете использовать его позже. Просто помните, что это обещание необходимо будет выполнить до того, как запросы будут поступать в вашу конечную точку GET, иначе они также не будут выполнены. Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...