"error": "select * from `alliance` where `alliance_description` = {} - SQLITE_ERROR: no such table: alliance

"error": "select * from `alliance` where `alliance_description` = {} - SQLITE_ERROR: no such table: alliance

问题 =>“错误”:“select * 来自 alliance 其中 alliance_description = {} - SQLITE_ERROR:没有这样的 table:联盟

$ npm run start:dev

> rest-api@1.0.0 start:dev D:\OSSE\back-end
> nodemon src/server.js

[nodemon] 2.0.7
[nodemon] to restart at any time, enter `rs`
[nodemon] watching path(s): *.*
[nodemon] watching extensions: js,mjs,json
[nodemon] starting `node src/server.js`
migrations [ 2, [] ]
Listening on Port 5000!
sqlite does not support inserting default values. Set the `useNullAsDefault` flag to hide this warning. (see docs

http://knexjs.org/#Builder-insert). GET /alliance 500 149.999 ms - 110 sqlite does not support inserting default values. Set the useNullAsDefault flag to hide this warning. (see docs http://knexjs.org/#Builder-insert). GET /alliance 500 6.629 ms - 110 GET /favicon.ico 404 0.703 ms - 40

Knex.js 配置

const path = require('path')

require('dotenv').config()

const {
  DATABASE_URL = 'postgresql://postgres@localhost/postgres',
} = process.env

module.exports = {
  development: {
    client: 'postgresql',
    connection: DATABASE_URL,
    pool: { min: 0, max: 100 },
    migrations: {
      directory: path.join(__dirname, 'src', 'db', 'migrations'),
    },
    seeds: {
      directory: path.join(__dirname, 'src', 'db', 'seeds'),
    },
    useNullAsDefault: true,
  },

  production: {
    client: 'postgresql',
    connection: DATABASE_URL,
    pool: { min: 0, max: 100 },
    migrations: {
      directory: path.join(__dirname, 'src', 'db', 'migrations'),
    },
    seeds: {
      directory: path.join(__dirname, 'src', 'db', 'seeds'),
    },
    useNullAsDefault: true,
  },

  test: {
    client: 'sqlite3',
    connection: {
      filename: ':memory:',
    },
    migrations: {
      directory: path.join(__dirname, 'src', 'db', 'migrations'),
    },
    seeds: {
      directory: path.join(__dirname, 'src', 'db', 'seeds'),
    },
    useNullAsDefault: true,
  },
}

Knex 连接

const env = process.env.NODE_ENV || 'development'
const config = require('../../knexfile')[env]
const knex = require('knex')(config)

module.exports = knex

Alliance.controller

const service = require('./alliance.service')
const wrapper = require('../errors/asyncErrorBoundary')

const list = async (req, res, next) => {
  const { alliance_description } = req.query
  const data = await service.list(req.query)
  if (alliance_description) {
    const data = await service.list(alliance_description)
    res.json({
      data: alliance_description,
    })
    return
  }
  return res.json({ data })
}

function allianceExists(req, res, next) {
  const allianceId = req.params.alliance_id
  const foundAlliance = alliance.find(
    (alliances) => alliances.id === alliance_id
  )
  if (foundAlliance) {
    res.locals.dish = foundAlliance
    return next()
  }
  next({
    status: 404,
    message: `Alliance ID ${allianceId} Doesn't Exist`,
  })
}

function checkAllianceId(req, res, next) {
  const allianceId = req.params.alliance_id
  const id = req.body.data.id
  if (allianceId !== id && id !== undefined && (id !== '') & (id !== null)) {
    return next({
      status: 400,
      message: `Alliance ID does not match route id. Alliance: ${id}, Route: ${allianceId}`,
    })
  }
  return next()
}

const update = async (req, res, next) => {
  const { alliance_id } = req.params
  const data = await service.update(alliance_id, req.body.data)
  res.status(200).json({
    data: data[0],
  })
}

const create = async (req, res, next) => {
  const newAlliance = res.locals.validAlliance
  const newRes = await service.create(newAlliance)
  res.status(201).json({ data: newRes[0] })
}

const show = async (req, res, next) => {
  const data = await service.show()
  return res.json({ data })
}

const read = async (req, res, next) => {
  const alliances = res.locals.alliance
  res.status(200).json({ data: alliance[0] })
}

const isValid = (req, res, next) => {
  if (!req.body.data)
    return next({ status: 400, message: 'No alliance selected' })
  const { alliance_name, alliance_description } = req.body.data
  const requiredFields = ['alliance_name', 'alliance_description']
  for (const field of requiredFields) {
    if (!req.body.data[field]) {
      return next({ status: 400, message: `Invalid input for ${field}` })
    }
  }
  res.locals.validAlliance = req.body.data
  next()
}

const destroy = async (req, res) => {
  const { alliance_id } = rq.params
  const des = await service.destroy(alliance_id)
  res.status(200)
}

module.exports = {
  list: [wrapper(list)],
  show: [wrapper(show)],
  read: [wrapper(checkAllianceId), wrapper(allianceExists), wrapper(read)],
  create: [wrapper(isValid), wrapper(create)],
  update: [wrapper(isValid), wrapper(allianceExists), wrapper(update)],
  destroy: [wrapper(destroy)],
}

Alliance.Router

const router = require('express').Router()
const controller = require('./alliance.controller')
const methodNotAllowed = require('../errors/methodNotAllowed')

router.route('/').get(controller.list).all(methodNotAllowed)

router
  .route('/:allianceId')
  .get(controller.list)
  .post(controller.create)
  .put(controller.update)
  .all(methodNotAllowed)

router
  .route('/:allianceId/:userId')
  .get(controller.list)
  .put(controller.update)
  .delete(controller.destroy)
  .all(methodNotAllowed)

module.exports = router

Alliance.service

const { default: knex } = require('knex')

const listAlliancesById = (knex, allianceId) =>
  knex('alliances as a').where({ 'a.alliance_id': allianceId })

const list = (alliance_description) => {
  return knex('alliance')
    .select('*')
    .from('alliance')
    .where({ alliance_description: alliance_description })
  // .orderBy('alliance_id')
}

const show = () => {
  return knex('alliance').select('*')
}

const read = (alliance_id) => {
  return knex('alliance').select('*').where({ alliance_id: alliance_id })
}

const create = (alliance) => {
  return knex('alliance').insert(alliance, '*')
}
const update = (alliance_id, updatedAlliance) => {
  return knex('alliance')
    .where({ alliance_id: alliance_id })
    .update(updatedAlliance)
    .returning('*')
}

const destroy = (alliance) => {
  return knex('alliance').delete(alliance).returning('*')
}

module.exports = {
  list,
  show,
  read,
  create,
  listAlliancesById,
  update,
  destroy,
}

数据库查询

希望有人能帮我解决这个问题。

您收到来自 sqlite dbms 的错误:

SQLITE_ERROR: no such table: alliance"

肯定是你的应用程序连接到 sqlite 而不是 postgresql 服务器,它在那里找不到 table。

所以请查看您的 config/connection 字符串,找出您的 knex 应用程序从哪里读取数据库连接

我解决了:

const { default: knex } = require('knex')
const knex = require(../db/connection) // <==== ANSWER

// was missing out of the .service file