Table '[database-name].sessions' 不存在 - 使用 express-session
Table '[database-name].sessions' doesn't exist - using express-session
这是一些概述我的问题的示例代码。我正在尝试让 express-session / connect-session-sequelize 为具有登录功能的网站工作。
但是,当我尝试调用我的 POST 请求时,出现以下错误:
我只能假设它正在尝试将会话数据存储到我的数据库中,但找不到 table。我可以通过进入并使用它想要的所有列手动创建 table 来绕过它,但我想知道我的代码中是否存在阻止程序包正常工作的问题(或者这是否应该如此工作。)
require('dotenv').config({ path: './config/.env' })
const express = require('express')
const session = require('express-session')
const mysql = require('mysql2')
const Sequelize = require('sequelize')
const path = require('path')
const SequelizeStore = require('connect-session-sequelize')(session.Store)
const app = express()
const PORT = 9999
app.use(express.json())
app.use(express.static(path.join(__dirname, 'public')))
// Allowing connection to database in Workbench
const db = new Sequelize('somedatabase', 'root', process.env.PASSWORD, {
host: 'localhost',
dialect: 'mysql'
})
db.authenticate()
.then(() => {
console.log('Connected...')
}).catch(error => {
console.log('Failed to connect...', error)
})
// Setting up session
app.use(session({
secret: 'shhh',
store: new SequelizeStore({
db: db
}),
resave: false,
saveUninitialized: true,
cookie: {
maxAge: 1000000
}
}))
// Sample model
const User = db.define('user', {
id: {
type: Sequelize.INTEGER,
primaryKey: true,
autoIncrement: true
},
username: Sequelize.STRING,
password: Sequelize.STRING
})
// Sample request
app.post('/api/create', async (req, res) => {
const newUser = {
username: john,
password: verysecurepassword
}
await User.create(newUser)
})
app.listen(PORT, () => {
console.log(`Listening on localhost:${PORT}...`)
})
在此代码中,您使用了几个包:express-session,它管理会话本身,但将会话的保存方式委托给 connect-session-sequelize。
所以问题是 connect-session-sequelize 试图在数据库中保存会话数据,但它不能,因为没有 table 用于会话。
正如这个包的文档中所写的那样(https://www.npmjs.com/package/connect-session-sequelize):
If you want SequelizeStore to create/sync the database table for you, you can call sync() against an instance of SequelizeStore along with options if needed.
所以尝试创建商店,将其附加到会话管理器,然后
初始化它(我没有测试这段代码):
// Setting up session
var myStore = new SequelizeStore({
db: db
});
app.use(
session({
secret: "shhh",
store: myStore,
resave: false,
saveUninitialized: true,
cookie: {
maxAge: 1000000
}
})
);
myStore.sync();
这是一些概述我的问题的示例代码。我正在尝试让 express-session / connect-session-sequelize 为具有登录功能的网站工作。
但是,当我尝试调用我的 POST 请求时,出现以下错误:
require('dotenv').config({ path: './config/.env' })
const express = require('express')
const session = require('express-session')
const mysql = require('mysql2')
const Sequelize = require('sequelize')
const path = require('path')
const SequelizeStore = require('connect-session-sequelize')(session.Store)
const app = express()
const PORT = 9999
app.use(express.json())
app.use(express.static(path.join(__dirname, 'public')))
// Allowing connection to database in Workbench
const db = new Sequelize('somedatabase', 'root', process.env.PASSWORD, {
host: 'localhost',
dialect: 'mysql'
})
db.authenticate()
.then(() => {
console.log('Connected...')
}).catch(error => {
console.log('Failed to connect...', error)
})
// Setting up session
app.use(session({
secret: 'shhh',
store: new SequelizeStore({
db: db
}),
resave: false,
saveUninitialized: true,
cookie: {
maxAge: 1000000
}
}))
// Sample model
const User = db.define('user', {
id: {
type: Sequelize.INTEGER,
primaryKey: true,
autoIncrement: true
},
username: Sequelize.STRING,
password: Sequelize.STRING
})
// Sample request
app.post('/api/create', async (req, res) => {
const newUser = {
username: john,
password: verysecurepassword
}
await User.create(newUser)
})
app.listen(PORT, () => {
console.log(`Listening on localhost:${PORT}...`)
})
在此代码中,您使用了几个包:express-session,它管理会话本身,但将会话的保存方式委托给 connect-session-sequelize。 所以问题是 connect-session-sequelize 试图在数据库中保存会话数据,但它不能,因为没有 table 用于会话。 正如这个包的文档中所写的那样(https://www.npmjs.com/package/connect-session-sequelize):
If you want SequelizeStore to create/sync the database table for you, you can call sync() against an instance of SequelizeStore along with options if needed.
所以尝试创建商店,将其附加到会话管理器,然后 初始化它(我没有测试这段代码):
// Setting up session
var myStore = new SequelizeStore({
db: db
});
app.use(
session({
secret: "shhh",
store: myStore,
resave: false,
saveUninitialized: true,
cookie: {
maxAge: 1000000
}
})
);
myStore.sync();