對于一個可能非常簡單的問題,我很抱歉,我對 javascript 和 SQLite 很陌生。我正在構建一個網頁,在服務器端我有一個資料庫,用于存盤所有用戶、他們的哈希密碼、會話 ID 等。
表“Writers”由四列組成:用戶名、密碼(這是散列的,使用 bcrypt)、sessionid 和 socketid。
當一個新用戶注冊時,我插入到資料庫中,使用這個:
async registerNewWriter(username, password) {
console.log("IN REG NEW WRITER", username, password);
const saltRounds = 10; // default
bcrypt.hash(password, saltRounds, async (err, hash) => {
if (err) {
throw new Error(err);
}
await this.database.get(
"INSERT INTO Writers (username, password, sessionid) VALUES (?,?,?)",
`${username}`,
`${hash}`,
`null`,
);
// return hash;
});
}
在此之后,為用戶創建一個會話。我使用這個更新資料庫:
async createSession(id, socketID, username) {
console.log('create session', id, socketID, username);
await this.database.get(
"UPDATE Writers SET sessionid = ?, socketid = ? WHERE username = ?",
`${id}`,
`${socketID}`,
`${username}`, (err) => {
if (err) {
throw new Error(err);
}
}
);
}
這是我得到錯誤的地方:[錯誤:SQLITE_RANGE:列索引超出范圍]。
我在網上查了很多類似的問題,但沒有特別找到解決這個問題的方法。我還確保檢查 sessionid、socketID 和用戶名都以正確的值進入 createSession,但我不明白為什么資料庫沒有正確更新。
如果您知道可能出了什么問題或有任何建議,我將不勝感激!謝謝 :)
uj5u.com熱心網友回復:
默認情況下,根據需要參考和轉義引數,這可能是您的問題。嘗試洗掉這些引號,如下所示:
async createSession(id, socketID, username) {
console.log('create session', id, socketID, username);
await this.database.get(
"UPDATE Writers SET sessionid = ?, socketid = ? WHERE username = ?",
id,
socketID,
username, (err) => {
if (err) {
throw new Error(err);
}
}
);
uj5u.com熱心網友回復:
如果您使用的是異步版本,則不需要(并且可能無法使用)回呼:
some_result = await this.database.get(
"UPDATE Writers SET sessionid = ?, socketid = ? WHERE username = ?",
`${id}`,
`${socketID}`,
`${username}`
}
);
uj5u.com熱心網友回復:
經過進一步的斗爭,我似乎已經解決了!我將在此處發布我的解決方案,以防有人遇到同樣的問題。
創建會話:
async createSession(id, socketID, username) {
console.log('create session', id, socketID, username);
await this.database.get(
"UPDATE Writers SET sessionid = ?, socketid = ? WHERE username = ?",
`${id}`,
`${socketID}`,
`${username}`,
);
// console.log("works? 222222")
}
注冊新用戶(問題是 bcrypt 回呼):
async registerNewWriter(username, password) {
console.log("IN REG NEW WRITER", username, password);
const saltRounds = 10; // default
const hashedPass = await new Promise((resolve,reject) => {
bcrypt.hash(password, saltRounds, (err, hash) => {
if (err) reject(err)
resolve(hash)
});
})
// console.log("hashed pass", hashedPass)
await this.database.get(
"INSERT INTO Writers (username, password, sessionid) VALUES (?,?,?)",
`${username}`,
`${hashedPass}`,
`null`
);
// console.log("hash very finished")
}
我現在覺得很傻,因為解決方案非常簡單,根本與查詢本身無關。非常感謝 bwt 讓我考慮回呼!:)
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/457747.html
上一篇:強制轉換變數更改變數名稱-SQL
